This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Cmd+Option+I.

library(raster)
size_dat=read.table("/Users/stijnhantson/Documents/projects/VIIRS_ros/fire_growth_5days_v4.txt", header=T, row.names=NULL)

size_dat=as.data.frame(size_dat)
size_dat=size_dat[-1,]
size_dat=size_dat[,-1]
colnames(size_dat)=c("firename","year","cause","size1","size2","size3","size4","size5","final_firesize","mean_precip1","mean_precip2","mean_precip3","mean_precip4","mean_precip5","mean_tmax1","mean_tmax2","mean_tmax3","mean_tmax4","mean_tmax5","mean_tmean1","mean_tmean2","mean_tmean3","mean_tmean4","mean_tmean5","mean_vpdmax1","mean_vpdmax2","mean_vpdmax3","mean_vpdmax4","mean_vpdmax5","mean_windspeed1","mean_windspeed2","mean_windspeed3","mean_windspeed4","mean_windspeed5","landcover","ecosystem","biomass","elevation")

size_dat2 <- data.frame(lapply(size_dat, function(x) as.numeric(as.character(x))))
NAs introduced by coercion
size_dat2$human = 0
size_dat2$human[size_dat2$cause !=1 & size_dat2$cause !=14 & size_dat2$cause !=17]=1
size_dat2$human[size_dat2$cause ==1 ]=2

pro1 =size_dat2[which(size_dat2$human == 2 & size_dat2$landcover == 1 ), ]
pro2 =size_dat2[which(size_dat2$human == 1 & size_dat2$landcover == 1 ), ]

t.test(pro1$size1,pro2$size1)

    Welch Two Sample t-test

data:  pro1$size1 and pro2$size1
t = -2.0397, df = 74.381, p-value = 0.04493
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -22.0986230  -0.2593373
sample estimates:
mean of x mean of y 
 3.056385 14.235365 
t.test(pro1$size2,pro2$size2)

    Welch Two Sample t-test

data:  pro1$size2 and pro2$size2
t = -2.758, df = 73.138, p-value = 0.007341
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -32.702045  -5.266208
sample estimates:
mean of x mean of y 
 8.254394 27.238521 
t.test(pro1$size3,pro2$size3)

    Welch Two Sample t-test

data:  pro1$size3 and pro2$size3
t = -2.9002, df = 58.203, p-value = 0.005254
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -51.965993  -9.526741
sample estimates:
mean of x mean of y 
 14.10484  44.85121 
t.test(pro1$size4,pro2$size4)

    Welch Two Sample t-test

data:  pro1$size4 and pro2$size4
t = -3.1797, df = 53.078, p-value = 0.002461
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -74.99798 -16.98040
sample estimates:
mean of x mean of y 
 17.68430  63.67349 
t.test(pro1$size5,pro2$size5)

    Welch Two Sample t-test

data:  pro1$size5 and pro2$size5
t = -3.4218, df = 39.443, p-value = 0.001462
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -117.71273  -30.26844
sample estimates:
mean of x mean of y 
 19.71795  93.70853 
pro =size_dat2[which(size_dat2$human == 1 & size_dat2$landcover == 1), ]
length(pro$year)
[1] 68
boxplot(pro$size1,pro$size2,pro$size3,pro$size4,pro$size5,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,500), cex.lab=1.4,cex.axis = 1.3)


pro =size_dat2[which(size_dat2$human == 2 & size_dat2$landcover == 1), ]
length(pro$year)
[1] 77
boxplot(pro$size1,pro$size2,pro$size3,pro$size4,pro$size5,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,500), cex.lab=1.4,cex.axis = 1.3)


pro =size_dat2[which(size_dat2$human == 1 & size_dat2$landcover == 2), ]
length(pro$year)
[1] 18
boxplot(pro$size1,pro$size2,pro$size3,pro$size4,pro$size5,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,500), cex.lab=1.4,cex.axis = 1.3)


pro =size_dat2[which(size_dat2$human == 2 & size_dat2$landcover == 2), ]
length(pro$year)
[1] 9
boxplot(pro$size1,pro$size2,pro$size3,pro$size4,pro$size5,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,500), cex.lab=1.4,cex.axis = 1.3)

length(!is.na(pro$size5))
[1] 9
pro =size_dat2[which(size_dat2$human == 1 & size_dat2$ecosystem == 6), ]
length(pro$year)
[1] 41
boxplot(pro$size1,pro$size2,pro$size3,pro$size4,pro$size5,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,500), cex.lab=1.4,cex.axis = 1.3)


pro =size_dat2[which(size_dat2$human == 2& size_dat2$ecosystem == 6), ]
length(pro$year)
[1] 79
boxplot(pro$size1,pro$size2,pro$size3,pro$size4,pro$size5,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,500), cex.lab=1.4,cex.axis = 1.3)

NA
NA

plot fire size map QGIS

library(data.table)
DT= data.table(res)
fire_size = DT[ , .SD[which.min(growth_km)], by = firename]

fire_size = fire_size[,c()]
spread_list =list.files(viirs_dir, pattern = "_daily.shp$", recursive = TRUE, full.names=T)
i=1
 l=shapefile(spread_list[i])
for (i in 2:length(spread_list)){
  p=shapefile(spread_list[i])
  l <- rbind(l, p, makeUniqueIDs = TRUE) 
}
 l$human = 0
l$human[l$cause !=1 & l$cause !=14 & l$cause !=17]=1
l$human[l$cause ==1 ]=2

     writeOGR(l, "/Users/stijnhantson/Documents/projects/VIIRS_ros/", layer= "all_fires", driver="ESRI Shapefile", overwrite_layer = T)
extract number and size statistics from frap
library(raster)

dr =shapefile("/Users/stijnhantson/Documents/projects/VIIRS_ros/frap_subset.shp")
dr1 =shapefile("/Users/stijnhantson/Documents/data/FRAP/fire18_1.shp")
dr1$YEAR_=as.numeric(as.character(dr1$YEAR_))
dr1$Shape_Area=as.numeric(as.character(dr1$Shape_Area))
dr1=dr1[!is.na(dr1$YEAR_), ]
dr1=dr1[dr1$YEAR_>2011,]
sum(dr1$Shape_Area)
[1] 25651974971
sum(dr$Shape_Area)
[1] 22801510990
  1. frap
  2. only fire growth datasets

tiff("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/mean_vs_max_ros_v1.tif", width = 5, height = 5, units = 'in', res = 300)
plot(res$ros_km,res$ros_mean_km, xlim=c(0,25),ylim=c(0,10), xlab="maximum fire-spread-rate (km/day)",ylab="mean fire-spread-rate (km/day)", cex.lab=1.4,cex.axis = 1.3)

dev.off()
null device 
          1 

plot mean vs max fire rate-of-spread

#summary(res)
plot(res$ros_km,res$ros_mean_km, xlab="maximum fire-spread-rate (km/day",ylab="mean fire-spread-rate (km/day)")


tiff("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/mean_vs_max_ros_v1.tif", width = 5, height = 5, units = 'in', res = 300)
plot(res$ros_km,res$ros_mean_km, xlim=c(0,25),ylim=c(0,10), xlab="maximum fire rate-of-spread (km/day)",ylab="mean fire rate-of-spread (km/day)", cex.lab=1.3,cex.axis = 1.25)
dev.off()
quartz_off_screen 
                2 

difference between human and lightnign fires

me=0
me1=0
days = c("day1","day2","day3","day4","day5")
pro1 = res[res$fire_day == 1 & res$human == 1,]
pro2 = res[res$fire_day == 2 & res$human == 1,]
pro3 = res[res$fire_day == 3 & res$human == 1,]
pro4 = res[res$fire_day == 4 & res$human == 1,]
pro5 = res[res$fire_day == 5 & res$human == 1,]
me[1] =mean(pro1$growth_km,na.omit=T)
me[2] =mean(pro2$growth_km,na.omit=T)
me[3] =mean(pro3$growth_km,na.omit=T)
me[4] =mean(pro4$growth_km,na.omit=T)
me[5] =mean(pro5$growth_km,na.omit=T)

pro1h = res[res$fire_day == 1 & res$human == 2,]
pro2h = res[res$fire_day == 2 & res$human == 2,]
pro3h = res[res$fire_day == 3 & res$human == 2,]
pro4h = res[res$fire_day == 4 & res$human == 2,]
pro5h = res[res$fire_day == 5 & res$human == 2,]
me1[1] =mean(pro1h$growth_km,na.omit=T)
me1[2] =mean(pro2h$growth_km,na.omit=T)
me1[3] =mean(pro3h$growth_km,na.omit=T)
me1[4] =mean(pro4h$growth_km,na.omit=T)
me1[5] =mean(pro5h$growth_km,na.omit=T)

boxplot(pro1$growth_km,pro2$growth_km,pro3$growth_km,pro4$growth_km,pro5$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,250), cex.lab=1.4,cex.axis = 1.3)


boxplot(pro1h$growth_km,pro2h$growth_km,pro3h$growth_km,pro4h$growth_km,pro5h$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,250), cex.lab=1.4,cex.axis = 1.3)

tiff("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/figure1_v1.tif", width = 10, height = 5, units = 'in', res = 300)
par(mfrow=c(1,2))
par(mar=c(4, 4, 1,0.1))
par(mgp=c(2.3,1,0))
boxplot(pro1$growth_km,pro2$growth_km,pro3$growth_km,pro4$growth_km,pro5$growth_km,names=c("1","2","3","4","5"),xlab="Day since fire start",ylab= expression('Fire size (km'^-1*')'),ylim=c(0,200), cex.lab=1.4,cex.axis = 1.3)
boxplot(pro1h$growth_km,pro2h$growth_km,pro3h$growth_km,pro4h$growth_km,pro5h$growth_km,names=c("1","2","3","4","5"),xlab="Day since fire start",ylab= "",ylim=c(0,200), cex.lab=1.4,cex.axis = 1.3)
dev.off()
quartz_off_screen 
                2 
tiff("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/sup_figure1_v1.tif", width = 10, height = 5, units = 'in', res = 300)
par(mfrow=c(1,2))
par(mar=c(4, 4, 1,0.1))
par(mgp=c(2.3,1,0))
boxplot(pro1$growth_km,pro2$growth_km,pro3$growth_km,pro4$growth_km,pro5$growth_km,names=c("1","2","3","4","5"),xlab="Day since fire start",ylab= expression('Fire size (km'^-1*')'),ylim=c(0,700), cex.lab=1.4,cex.axis = 1.3)
boxplot(pro1h$growth_km,pro2h$growth_km,pro3h$growth_km,pro4h$growth_km,pro5h$growth_km,names=c("1","2","3","4","5"),xlab="Day since fire start",ylab= "",ylim=c(0,700), cex.lab=1.4,cex.axis = 1.3)
dev.off() 
quartz_off_screen 
                2 
par(mgp=c(2.3,1,0))  

plot(me,type="o", ylim=c(0,150),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n', lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days)
points(me1,type="o",lty = 2, lwd = 2)


t.test(log(pro1$growth_km),log(pro1h$growth_km))

    Welch Two Sample t-test

data:  log(pro1$growth_km) and log(pro1h$growth_km)
t = 6.5083, df = 169.36, p-value = 8.265e-10
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 1.492386 2.791866
sample estimates:
 mean of x  mean of y 
 1.3226886 -0.8194377 
t.test(log(pro2$growth_km),log(pro2h$growth_km))

    Welch Two Sample t-test

data:  log(pro2$growth_km) and log(pro2h$growth_km)
t = 6.9843, df = 134.4, p-value = 1.199e-10
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 1.369607 2.451706
sample estimates:
mean of x mean of y 
2.7559564 0.8453003 
t.test(log(pro3$growth_km),log(pro3h$growth_km))

    Welch Two Sample t-test

data:  log(pro3$growth_km) and log(pro3h$growth_km)
t = 5.3694, df = 137.17, p-value = 3.286e-07
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.9293526 2.0129234
sample estimates:
mean of x mean of y 
 3.186372  1.715234 
t.test(log(pro4$growth_km),log(pro4h$growth_km))

    Welch Two Sample t-test

data:  log(pro4$growth_km) and log(pro4h$growth_km)
t = 4.6217, df = 122.92, p-value = 9.467e-06
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.6909157 1.7261008
sample estimates:
mean of x mean of y 
 3.513204  2.304696 
t.test(log(pro5$growth_km),log(pro5h$growth_km))

    Welch Two Sample t-test

data:  log(pro5$growth_km) and log(pro5h$growth_km)
t = 4.9328, df = 103.98, p-value = 3.089e-06
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.9170094 2.1499736
sample estimates:
mean of x mean of y 
 3.895266  2.361774 

##################3 for western cordillera ecoregion ##################

me=0
me1=0
pro1 = res[res$fire_day == 1 & res$human == 1 & (res$eco1 == 6 | res$eco1 == 7),]
pro2 = res[res$fire_day == 2 & res$human == 1 & (res$eco1 == 6 | res$eco1 == 7),]
pro3 = res[res$fire_day == 3 & res$human == 1 & (res$eco1 == 6 | res$eco1 == 7),]
pro4 = res[res$fire_day == 4 & res$human == 1 & (res$eco1 == 6 | res$eco1 == 7),]
pro5 = res[res$fire_day == 5 & res$human == 1 & (res$eco1 == 6 | res$eco1 == 7),]
me[1] =mean(pro1$growth_km,na.omit=T)
me[2] =mean(pro2$growth_km,na.omit=T)
me[3] =mean(pro3$growth_km,na.omit=T)
me[4] =mean(pro4$growth_km,na.omit=T)
me[5] =mean(pro5$growth_km,na.omit=T)
boxplot(pro1$growth_km,pro2$growth_km,pro3$growth_km,pro4$growth_km,pro5$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,250), cex.lab=1.4,cex.axis = 1.3)


pro1h = res[res$fire_day == 1 & res$human == 2 & (res$eco1 == 6 | res$eco1 == 7),]
pro2h = res[res$fire_day == 2 & res$human == 2 & (res$eco1 == 6 | res$eco1 == 7),]
pro3h = res[res$fire_day == 3 & res$human == 2 & (res$eco1 == 6 | res$eco1 == 7),]
pro4h = res[res$fire_day == 4 & res$human == 2 & (res$eco1 == 6 | res$eco1 == 7),]
pro5h = res[res$fire_day == 5 & res$human == 2 & (res$eco1 == 6 | res$eco1 == 7),]
me1[1] =mean(pro1h$growth_km,na.rm=T)
me1[2] =mean(pro2h$growth_km,na.rm=T)
me1[3] =mean(pro3h$growth_km,na.rm=T)
me1[4] =mean(pro4h$growth_km,na.rm=T)
me1[5] =mean(pro5h$growth_km,na.rm=T)
boxplot(pro1h$growth_km,pro2h$growth_km,pro3h$growth_km,pro4h$growth_km,pro5h$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,250), cex.lab=1.4,cex.axis = 1.3)



plot(me,type="o", ylim=c(0,150),ylab="fire size (km2)",xlab="", xaxt='n')
axis(side=1, at=c(1:5),labels=days)
points(me1,type="o")


t.test(log(pro1$growth_km),log(pro1h$growth_km))

    Welch Two Sample t-test

data:  log(pro1$growth_km) and log(pro1h$growth_km)
t = 3.2086, df = 69.426, p-value = 0.002019
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.5363985 2.2992588
sample estimates:
 mean of x  mean of y 
 0.4219047 -0.9959240 
t.test(log(pro2$growth_km),log(pro2h$growth_km))

    Welch Two Sample t-test

data:  log(pro2$growth_km) and log(pro2h$growth_km)
t = 4.9267, df = 97.316, p-value = 3.427e-06
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.9938201 2.3346153
sample estimates:
mean of x mean of y 
 2.303104  0.638886 
t.test(log(pro3$growth_km),log(pro3h$growth_km))

    Welch Two Sample t-test

data:  log(pro3$growth_km) and log(pro3h$growth_km)
t = 3.4468, df = 82.843, p-value = 0.0008936
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.4842092 1.8055445
sample estimates:
mean of x mean of y 
 2.695279  1.550402 
t.test(log(pro4$growth_km),log(pro4h$growth_km))

    Welch Two Sample t-test

data:  log(pro4$growth_km) and log(pro4h$growth_km)
t = 3.019, df = 73.938, p-value = 0.003479
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.3104149 1.5156656
sample estimates:
mean of x mean of y 
 3.092997  2.179957 
t.test(log(pro5$growth_km),log(pro5h$growth_km))

    Welch Two Sample t-test

data:  log(pro5$growth_km) and log(pro5h$growth_km)
t = 3.1504, df = 55.57, p-value = 0.002625
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.4138127 1.8597722
sample estimates:
mean of x mean of y 
 3.402659  2.265867 
mean(pro1$growth_km,na.omit=T)
[1] 16.60532
mean(pro1h$growth_km,na.rm=T)
[1] 2.714784

for mediteranean california

pro1 = res[res$fire_day == 1 & res$human == 1 & (res$eco1 == 11),]
pro2 = res[res$fire_day == 2 & res$human == 1 & (res$eco1 == 11),]
pro3 = res[res$fire_day == 3 & res$human == 1 & (res$eco1 == 11),]
pro4 = res[res$fire_day == 4 & res$human == 1 & (res$eco1 == 11),]
pro5 = res[res$fire_day == 5 & res$human == 1 & (res$eco1 == 11),]

boxplot(pro1$growth_km,pro2$growth_km,pro3$growth_km,pro4$growth_km,pro5$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)


pro1h = res[res$fire_day == 1 & res$human == 2 & (res$eco1 == 11),]
pro2h = res[res$fire_day == 2 & res$human == 2 & (res$eco1 == 11),]
pro3h = res[res$fire_day == 3 & res$human == 2 & (res$eco1 == 11),]
pro4h = res[res$fire_day == 4 & res$human == 2 & (res$eco1 == 11),]
pro5h = res[res$fire_day == 5 & res$human == 2 & (res$eco1 == 11),]

boxplot(pro1h$growth_km,pro2h$growth_km,pro3h$growth_km,pro4h$growth_km,pro5h$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)


me[1] =mean(pro1$growth_km,na.omit=T)
me[2] =mean(pro2$growth_km,na.omit=T)
me[3] =mean(pro3$growth_km,na.omit=T)
me[4] =mean(pro4$growth_km,na.omit=T)
me[5] =mean(pro5$growth_km,na.omit=T)

me1[1] =mean(pro1h$growth_km,na.rm=T)
me1[2] =mean(pro2h$growth_km,na.rm=T)
me1[3] =mean(pro3h$growth_km,na.rm=T)
me1[4] =mean(pro4h$growth_km,na.rm=T)
me1[5] =mean(pro5h$growth_km,na.rm=T)

plot(me,type="o", ylim=c(0,150),ylab="fire size (km2)",xlab="", xaxt='n')
axis(side=1, at=c(1:5),labels=days)
points(me1,type="o")

for difference in autumn

pro1 = res[res$fire_day == 1 & res$human == 1 & res$month >8,]
pro2 = res[res$fire_day == 2 & res$human == 1 & res$month >8,]
pro3 = res[res$fire_day == 3 & res$human == 1 & res$month >8,]
pro4 = res[res$fire_day == 4 & res$human == 1 & res$month >8,]
pro5 = res[res$fire_day == 5 & res$human == 1 & res$month >8,]

boxplot(pro1$growth_km,pro2$growth_km,pro3$growth_km,pro4$growth_km,pro5$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)


pro1h = res[res$fire_day == 1 & res$human == 2 & res$month >8,]
pro2h = res[res$fire_day == 2 & res$human == 2 & res$month >8,]
pro3h = res[res$fire_day == 3 & res$human == 2 & res$month >8,]
pro4h = res[res$fire_day == 4 & res$human == 2 & res$month >8,]
pro5h = res[res$fire_day == 5 & res$human == 2 & res$month >8,]

boxplot(pro1h$growth_km,pro2h$growth_km,pro3h$growth_km,pro4h$growth_km,pro5h$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)


me[1] =mean(pro1$growth_km,na.omit=T)
me[2] =mean(pro2$growth_km,na.omit=T)
me[3] =mean(pro3$growth_km,na.omit=T)
me[4] =mean(pro4$growth_km,na.omit=T)
me[5] =mean(pro5$growth_km,na.omit=T)

me1[1] =mean(pro1h$growth_km,na.rm=T)
me1[2] =mean(pro2h$growth_km,na.rm=T)
me1[3] =mean(pro3h$growth_km,na.rm=T)
me1[4] =mean(pro4h$growth_km,na.rm=T)
me1[5] =mean(pro5h$growth_km,na.rm=T)

plot(me,type="o", ylim=c(0,150),ylab="fire size (km2)",xlab="", xaxt='n')
axis(side=1, at=c(1:5),labels=days)
points(me1,type="o")

for difference in summer

pro1 = res[res$fire_day == 1 & res$human == 1 & res$month <=8 ,]
pro2 = res[res$fire_day == 2 & res$human == 1 & res$month <=8,]
pro3 = res[res$fire_day == 3 & res$human == 1 & res$month <=8,]
pro4 = res[res$fire_day == 4 & res$human == 1 & res$month <=8,]
pro5 = res[res$fire_day == 5 & res$human == 1 & res$month <=8,]

boxplot(pro1$growth_km,pro2$growth_km,pro3$growth_km,pro4$growth_km,pro5$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)


pro1h = res[res$fire_day == 1 & res$human == 2 & res$month <=8,]
pro2h = res[res$fire_day == 2 & res$human == 2 & res$month <=8,]
pro3h = res[res$fire_day == 3 & res$human == 2 & res$month <=8,]
pro4h = res[res$fire_day == 4 & res$human == 2 & res$month <=8,]
pro5h = res[res$fire_day == 5 & res$human == 2 & res$month <=8,]

boxplot(pro1h$growth_km,pro2h$growth_km,pro3h$growth_km,pro4h$growth_km,pro5h$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)


me[1] =mean(pro1$growth_km,na.omit=T)
me[2] =mean(pro2$growth_km,na.omit=T)
me[3] =mean(pro3$growth_km,na.omit=T)
me[4] =mean(pro4$growth_km,na.omit=T)
me[5] =mean(pro5$growth_km,na.omit=T)

me1[1] =mean(pro1h$growth_km,na.rm=T)
me1[2] =mean(pro2h$growth_km,na.rm=T)
me1[3] =mean(pro3h$growth_km,na.rm=T)
me1[4] =mean(pro4h$growth_km,na.rm=T)
me1[5] =mean(pro5h$growth_km,na.rm=T)

plot(me,type="o", ylim=c(0,150),ylab="fire size (km2)",xlab="", xaxt='n')
axis(side=1, at=c(1:5),labels=days)
points(me1,type="o")

NA
NA

for difference in summer in western cordillera

pro1 = res[res$fire_day == 1 & res$human == 1 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro2 = res[res$fire_day == 2 & res$human == 1 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro3 = res[res$fire_day == 3 & res$human == 1 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro4 = res[res$fire_day == 4 & res$human == 1 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro5 = res[res$fire_day == 5 & res$human == 1 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 6 | res$eco1 == 7),]

boxplot(pro1$growth_km,pro2$growth_km,pro3$growth_km,pro4$growth_km,pro5$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)


pro1h = res[res$fire_day == 1 & res$human == 2 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro2h = res[res$fire_day == 2 & res$human == 2 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro3h = res[res$fire_day == 3 & res$human == 2 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro4h = res[res$fire_day == 4 & res$human == 2 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro5h = res[res$fire_day == 5 & res$human == 2 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 6 | res$eco1 == 7),]

boxplot(pro1h$growth_km,pro2h$growth_km,pro3h$growth_km,pro4h$growth_km,pro5h$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)


t.test(log(pro1$growth_km),log(pro1h$growth_km))

    Welch Two Sample t-test

data:  log(pro1$growth_km) and log(pro1h$growth_km)
t = 1.3062, df = 51.551, p-value = 0.1973
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.3236595  1.5299715
sample estimates:
 mean of x  mean of y 
-0.1773847 -0.7805406 
t.test(log(pro2$growth_km),log(pro2h$growth_km))

    Welch Two Sample t-test

data:  log(pro2$growth_km) and log(pro2h$growth_km)
t = 3.6535, df = 78.926, p-value = 0.0004639
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.5639969 1.9140943
sample estimates:
mean of x mean of y 
2.0787175 0.8396718 
t.test(log(pro3$growth_km),log(pro3h$growth_km))

    Welch Two Sample t-test

data:  log(pro3$growth_km) and log(pro3h$growth_km)
t = 2.1785, df = 57.055, p-value = 0.03352
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.05727942 1.36024900
sample estimates:
mean of x mean of y 
 2.551723  1.842958 
t.test(log(pro4$growth_km),log(pro4h$growth_km))

    Welch Two Sample t-test

data:  log(pro4$growth_km) and log(pro4h$growth_km)
t = 2.353, df = 57.21, p-value = 0.02208
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.1074894 1.3347908
sample estimates:
mean of x mean of y 
 2.992332  2.271192 
t.test(log(pro5$growth_km),log(pro5h$growth_km))

    Welch Two Sample t-test

data:  log(pro5$growth_km) and log(pro5h$growth_km)
t = 2.3446, df = 41.508, p-value = 0.02391
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.105315 1.410281
sample estimates:
mean of x mean of y 
 3.313679  2.555881 
me[1] =mean(pro1$growth_km,na.omit=T)
me[2] =mean(pro2$growth_km,na.omit=T)
me[3] =mean(pro3$growth_km,na.omit=T)
me[4] =mean(pro4$growth_km,na.omit=T)
me[5] =mean(pro5$growth_km,na.omit=T)

me1[1] =mean(pro1h$growth_km,na.rm=T)
me1[2] =mean(pro2h$growth_km,na.rm=T)
me1[3] =mean(pro3h$growth_km,na.rm=T)
me1[4] =mean(pro4h$growth_km,na.rm=T)
me1[5] =mean(pro5h$growth_km,na.rm=T)

plot(me,type="o", ylim=c(0,150),ylab="fire size (km2)",xlab="", xaxt='n')
axis(side=1, at=c(1:5),labels=days)
points(me1,type="o")

pro1 = res[res$fire_day == 1 & res$human == 1 & ( res$month >8 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro2 = res[res$fire_day == 2 & res$human == 1 & ( res$month >8 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro3 = res[res$fire_day == 3 & res$human == 1 & ( res$month >8 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro4 = res[res$fire_day == 4 & res$human == 1 & ( res$month >8 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro5 = res[res$fire_day == 5 & res$human == 1 & ( res$month >8 ) & (res$eco1 == 6 | res$eco1 == 7),]

boxplot(pro1$growth_km,pro2$growth_km,pro3$growth_km,pro4$growth_km,pro5$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)


pro1h = res[res$fire_day == 1 & res$human == 2 & ( res$month >8 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro2h = res[res$fire_day == 2 & res$human == 2 & ( res$month >8 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro3h = res[res$fire_day == 3 & res$human == 2 & ( res$month >8 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro4h = res[res$fire_day == 4 & res$human == 2 & (  res$month >8 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro5h = res[res$fire_day == 5 & res$human == 2 & ( res$month >8 ) & (res$eco1 == 6 | res$eco1 == 7),]

boxplot(pro1h$growth_km,pro2h$growth_km,pro3h$growth_km,pro4h$growth_km,pro5h$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)

`

how many days does it take to reach 75% burnt area

res75 = res[res$per_ba > 0.75,]
peak_day = as.data.frame(aggregate(res75$fire_day, by = list(res75$firename,res75$cause), min))
peak_day=subset(peak_day,x < 55)
hi = hist(peak_day$x,prob =F, breaks= c(0:53), xlim=c(0,55), ylab="number of fires", xlab="days", cex.lab=1.4,cex.axis=1.3)


out1 = subset(res75,cause == 1 )   #1=lightning; 14=unknown; 7=arson
out2 = subset(res75,cause !=1 & cause != 14 )
peak_day1 = as.data.frame(aggregate(out1$fire_day, by = list(out1$firename), min))
peak_day2 = as.data.frame(aggregate(out2$fire_day, by = list(out2$firename), min))

quantile(peak_day1$x,0.50,type=3) 
50% 
 10 
quantile(peak_day2$x,0.50,type=3) 
50% 
  3 
peak_day1=subset(peak_day1,x < 56)
peak_day2=subset(peak_day2,x < 56)
hist.a =hist(peak_day1$x,breaks =c(0:55),plot=F)
hist.b =hist(peak_day2$x,breaks =c(0:55),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)

fr = barplot(fg,xlab="Days after ignition",ylab="Number of fires",cex.lab=1.4,cex.axis = 1.3, xlim=c(1,65), ylim=c(0,30))
axis(1,c(0.7,5.5,11.5,17.5,23.5,29.5,35.5,41.5,47.5,53.5,59.5,65.5),labels=c(1,5,10,15,20,25,30,35,40,45,50,55),cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")

tiff(file="/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/time_to_reach75_v1.tif",width=2500,height=2000, res=350)
fr = barplot(fg,xlab="Days after ignition",ylab="Number of fires",cex.lab=1.4,cex.axis = 1.3, xlim=c(1,65), ylim=c(0,30))
axis(1,c(0.7,5.5,11.5,17.5,23.5,29.5,35.5,41.5,47.5,53.5,59.5,65.5),labels=c(1,5,10,15,20,25,30,35,40,45,50,55),cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")
dev.off()
quartz_off_screen 
                3 

difference in fire size for first 5 days across california and both ecosystems

 
res$ros1 = res$max_ros+1


out1 = subset(res,cause == 1 )   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,cause !=1 & cause != 14 )

hum1 = out2[out2$fire_day ==1,]
hum2 = out2[out2$fire_day ==2,]
hum3 = out2[out2$fire_day ==3,]
hum4 = out2[out2$fire_day ==4,]
hum5 = out2[out2$fire_day ==5,]
lig1 = out1[out1$fire_day ==1,]
lig2 = out1[out1$fire_day ==2,]
lig3 = out1[out1$fire_day ==3,]
lig4 = out1[out1$fire_day ==4,]
lig5 = out1[out1$fire_day ==5,]
mean(hum1$growth)
[1] 18753898
mean(hum2$growth)
[1] 36707455
mean(hum3$growth)
[1] 57176147
mean(hum4$growth)
[1] 80694648
mean(hum5$growth)
[1] 115079142
mean(lig1$growth)
[1] 2875395
mean(lig2$growth)
[1] 10065897
mean(lig3$growth)
[1] 18876394
mean(lig4$growth)
[1] 28689523
mean(lig5$growth)
[1] 37533565
t.test(log10(hum1$growth),log10(lig1$growth))

    Welch Two Sample t-test

data:  log10(hum1$growth) and log10(lig1$growth)
t = 6.5083, df = 169.36, p-value = 8.265e-10
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.6481351 1.2124922
sample estimates:
mean of x mean of y 
 6.574436  5.644123 
t.test(log10(hum2$growth),log10(lig2$growth))

    Welch Two Sample t-test

data:  log10(hum2$growth) and log10(lig2$growth)
t = 6.9843, df = 134.4, p-value = 1.199e-10
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.5948126 1.0647622
sample estimates:
mean of x mean of y 
 7.196897  6.367109 
t.test(log10(hum3$growth),log10(lig3$growth))

    Welch Two Sample t-test

data:  log10(hum3$growth) and log10(lig3$growth)
t = 5.3694, df = 137.17, p-value = 3.286e-07
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.4036127 0.8742015
sample estimates:
mean of x mean of y 
 7.383824  6.744917 
t.test(log10(hum4$growth),log10(lig4$growth))

    Welch Two Sample t-test

data:  log10(hum4$growth) and log10(lig4$growth)
t = 4.6217, df = 122.92, p-value = 9.467e-06
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.3000609 0.7496361
sample estimates:
mean of x mean of y 
 7.525765  7.000917 
t.test(log10(hum5$growth),log10(lig5$growth))

    Welch Two Sample t-test

data:  log10(hum5$growth) and log10(lig5$growth)
t = 4.9328, df = 103.98, p-value = 3.089e-06
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.3982521 0.9337217
sample estimates:
mean of x mean of y 
 7.691692  7.025706 
hum1 = out2[out2$fire_day ==1 & out2$eco1==6,]
hum2 = out2[out2$fire_day ==2 & out2$eco1==6,]
hum3 = out2[out2$fire_day ==3 & out2$eco1==6,]
hum4 = out2[out2$fire_day ==4 & out2$eco1==6,]
hum5 = out2[out2$fire_day ==5 & out2$eco1==6,]
lig1 = out1[out1$fire_day ==1 & out1$eco1==6,]
lig2 = out1[out1$fire_day ==2 & out1$eco1==6,]
lig3 = out1[out1$fire_day ==3 & out1$eco1==6,]
lig4 = out1[out1$fire_day ==4 & out1$eco1==6,]
lig5 = out1[out1$fire_day ==5 & out1$eco1==6,]
mean(hum1$growth)
[1] 16605316
mean(hum2$growth)
[1] 30366275
mean(hum3$growth)
[1] 44666667
mean(hum4$growth)
[1] 63374279
mean(hum5$growth)
[1] 85629090
mean(lig1$growth, na.rm=T)
[1] 2747161
mean(lig2$growth, na.rm=T)
[1] 8686182
mean(lig3$growth, na.rm=T)
[1] 15363041
mean(lig4$growth, na.rm=T)
[1] 21997987
mean(lig5$growth, na.rm=T)
[1] 26941885
t.test(log10(hum1$growth),log10(lig1$growth))

    Welch Two Sample t-test

data:  log10(hum1$growth) and log10(lig1$growth)
t = 3.1605, df = 69.967, p-value = 0.002328
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.2244363 0.9921939
sample estimates:
mean of x mean of y 
 6.183231  5.574916 
t.test(log10(hum2$growth),log10(lig2$growth))

    Welch Two Sample t-test

data:  log10(hum2$growth) and log10(lig2$growth)
t = 4.8606, df = 97.58, p-value = 4.473e-06
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.4247076 1.0108416
sample estimates:
mean of x mean of y 
 7.000225  6.282451 
t.test(log10(hum3$growth),log10(lig3$growth))

    Welch Two Sample t-test

data:  log10(hum3$growth) and log10(lig3$growth)
t = 3.4215, df = 83.534, p-value = 0.0009662
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.2080219 0.7855227
sample estimates:
mean of x mean of y 
 7.170545  6.673773 
t.test(log10(hum4$growth),log10(lig4$growth))

    Welch Two Sample t-test

data:  log10(hum4$growth) and log10(lig4$growth)
t = 2.9997, df = 74.706, p-value = 0.00367
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.1331595 0.6597929
sample estimates:
mean of x mean of y 
 7.343272  6.946796 
t.test(log10(hum5$growth),log10(lig5$growth))

    Welch Two Sample t-test

data:  log10(hum5$growth) and log10(lig5$growth)
t = 3.1455, df = 56.335, p-value = 0.002647
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.1801401 0.8117505
sample estimates:
mean of x mean of y 
 7.477756  6.981811 
hum1 = out2[out2$fire_day ==1 & out2$eco1==11,]
hum2 = out2[out2$fire_day ==2 & out2$eco1==11,]
hum3 = out2[out2$fire_day ==3 & out2$eco1==11,]
hum4 = out2[out2$fire_day ==4 & out2$eco1==11,]
hum5 = out2[out2$fire_day ==5 & out2$eco1==11,]
lig1 = out1[out1$fire_day ==1 & out1$eco1==11,]
lig2 = out1[out1$fire_day ==2 & out1$eco1==11,]
lig3 = out1[out1$fire_day ==3 & out1$eco1==11,]
lig4 = out1[out1$fire_day ==4 & out1$eco1==11,]
lig5 = out1[out1$fire_day ==5 & out1$eco1==11,]
mean(hum1$growth)
[1] 21604386
mean(hum2$growth)
[1] 43011405
mean(hum3$growth)
[1] 71836206
mean(hum4$growth)
[1] 110978456
mean(hum5$growth)
[1] 156565228
mean(lig1$growth, na.rm=T)
[1] 12710105
mean(lig2$growth, na.rm=T)
[1] 24454241
mean(lig3$growth, na.rm=T)
[1] 39894008
mean(lig4$growth, na.rm=T)
[1] NaN
mean(lig5$growth, na.rm=T)
[1] NaN
#t.test(log10(hum1$growth),log10(lig1$growth))
#t.test(log10(hum2$growth),log10(lig2$growth))
t.test(log10(hum3$growth),log10(lig3$growth))
Error in t.test.default(log10(hum3$growth), log10(lig3$growth)) : 
  not enough 'y' observations


out1 = subset(res,cause == 1 & (eco1 == 6 | eco1 == 7) & (month > 9))   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,cause !=1 & cause != 14 & (eco1 == 6 | eco1 == 7) & (month > 9))

hist.a =hist(out1$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
hist.b =hist(out2$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)

fr = barplot(fg, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab="Number of fire days",cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5,30.5,33.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")

out1 = subset(res,cause == 1 & eco1 == 11 & (month > 9))   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,cause !=1 & cause != 14 & eco1 == 11 & (month > 9))

hist.a =hist(out1$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
hist.b =hist(out2$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)

fr = barplot(fg, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab="Number of fire days",cex.lab=1.4,cex.axis = 1.3)

axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5,30.5,33.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")



out1 = subset(res,cause == 1 & (eco1 == 6 | eco1 == 7) & (month > 5 & month<10))   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,cause !=1 & cause != 14 & (eco1 == 6 | eco1 == 7) & (month > 5 & month<10))

hist.a =hist(out1$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
hist.b =hist(out2$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)

fr = barplot(fg, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab="Number of fire days",cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5,30.5,33.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")


out1 = subset(res,cause == 1 & eco1 == 11  & (month > 5 & month<10))   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,cause !=1 & cause != 14 & eco1 == 11  & (month > 5 & month<10))

hist.a =hist(out1$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
hist.b =hist(out2$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)

fr = barplot(fg, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab="Number of fire days",cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5,30.5,33.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")

are ROS the same for light & human under the same conditions

summary(lm(out1$vpd~log(out1$ros_km+1),na.omit=T))
In lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) :
 extra argument ‘na.omit’ will be disregarded

Call:
lm(formula = out1$vpd ~ log(out1$ros_km + 1), na.omit = T)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.11204 -0.40156 -0.05854  0.30543  2.12623 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)    
(Intercept)           1.44554    0.02221   65.09   <2e-16 ***
log(out1$ros_km + 1)  0.52491    0.03383   15.52   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.5888 on 1534 degrees of freedom
  (265 observations deleted due to missingness)
Multiple R-squared:  0.1356,    Adjusted R-squared:  0.1351 
F-statistic: 240.7 on 1 and 1534 DF,  p-value: < 2.2e-16

analysis of the first day

load data


daily_res=read.table("/Users/stijnhantson/Documents/projects/VIIRS_ros/all_ignitions_V3.txt",header=T)

res=as.data.frame(daily_res)

res$bi =as.numeric(as.character(res$bi))
res$erc =as.numeric(as.character(res$erc))
res$etr =as.numeric(as.character(res$etr))
res$fm100 =as.numeric(as.character(res$fm100))
res$fm1000 =as.numeric(as.character(res$fm1000))
res$pet =as.numeric(as.character(res$pet))
res$pr =as.numeric(as.character(res$pr))
res$rmax =as.numeric(as.character(res$rmax))
res$rmin =as.numeric(as.character(res$rmin))
res$th =as.numeric(as.character(res$th))
res$tmmn =as.numeric(as.character(res$tmmn))
res$tmmx =as.numeric(as.character(res$tmmx))
res$vpd =as.numeric(as.character(res$vpd))
res$ws =as.numeric(as.character(res$ws))
res$vs =as.numeric(as.character(res$vs))
res$total_area =as.numeric(as.character(res$total_area))
res$max_land =as.numeric(as.character(res$max_land))
res$mean_land =as.numeric(as.character(res$mean_land))

res$biomass =as.numeric(as.character(res$biomass))

res = res[-1,]
res$human[res$cause ==1] =1
res$human[res$cause !=1 & res$cause !=14] =0

analysis


out1 = res[res$cause !=1 & res$cause != 14,] 
out2 = res[res$cause ==1,] 

out1 = subset(res,(eco1 == 6 |eco1 == 7) & res$cause !=1 & res$cause != 14)   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,(eco1 == 6 |eco1 == 7) & res$cause ==1)   #1=lightning; 14=unknown; 7=arson

out1 = subset(res,eco1 == 11& res$cause !=1 & res$cause != 14)
out2 = subset(res,eco1 == 11 & res$cause ==1)

out1 = subset(res,(eco1 == 6 |eco1 == 7) & res$cause !=1 & res$cause != 14 & res$mont > 5 & res$mont < 10 )   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,(eco1 == 6 |eco1 == 7) & res$cause ==1& res$mont > 5 & res$mont < 10)   #1=lightning; 14=unknown; 7=arson

t.test(out1$bi,out2$bi)
t.test(out1$erc,out2$erc)
t.test(out1$etr,out2$etr)
t.test(out1$fm100,out2$fm100)
t.test(out1$fm1000,out2$fm1000)
t.test(out1$pet,out2$pet)
t.test(out1$pr,out2$pr)
t.test(out1$rmax,out2$rmax)
t.test(out1$rmin,out2$rmin)
t.test(out1$th,out2$th)
t.test(out1$tmmn,out2$tmmn)
t.test(out1$tmmx,out2$tmmx)
t.test(out1$vpd,out2$vpd)
t.test(out1$vs,out2$vs)
t.test(out1$ws,out2$ws)
t.test(out1$biomass,out2$biomass)
t.test(out1$mean_land,out2$mean_land)
t.test(log10(out1$total_area),log10(out2$total_area))

ta = table(res$human,res$mont)
ps = barplot(ta, beside=TRUE, ylab="number of fires",xpd=T,xlab= "month", xaxt='n',ylim=c(0,300), axis.lty=1,cex.lab = 1.4,cex.axis = 1.2 )
axis(1,at=c(2,5,8,11,14,17,20,23,26,29,32,35), labels =c(1:12),xlim=c(0,36),xpd=F ,cex.lab = 1.4,cex.axis = 1.3)
legend("topright",c("human","lightning"),fill = c("grey", "black"), bty="n",cex=1.4)
text(1,285,"a)",cex=1.8)

out1 = subset(res,eco1 == 6 |eco1 == 7)   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,eco1 == 11)

ta = table(out1$human,out1$mont)
ps = barplot(ta, beside=TRUE, ylab="number of fires",xpd=T, xaxt='n',xlab= "month", ylim=c(0,200), axis.lty=1,cex.lab = 1.4,cex.axis = 1.2 )
axis(1,at=c(2,5,8,11,14,17,20,23,26,29,32,35), labels =c(1:12),xlim=c(0,36),xpd=F,cex.lab = 1.4,cex.axis = 1.3 )
legend("topright",c("human","lightning"),fill = c("grey", "black"), bty="n",cex=1.4)
text(1,190,"b)",cex=1.8)


ta = table(out2$human,out2$mont)
ps = barplot(ta, beside=TRUE, ylab="number of fires",xpd=T,xaxt='n',xlab= "month", ylim=c(0,200), axis.lty=1,cex.lab = 1.4,cex.axis = 1.2 )
axis(1,at=c(2,5,8,11,14,17,20,23,26,29,32,35), labels =c(1:12),xlim=c(0,36),xpd=F,cex.lab = 1.4,cex.axis = 1.3 )
legend("topright",c("human","lightning"),fill = c("grey", "black"), bty="n",cex=1.4)
text(1,190,"c)",cex=1.8)



plot(data_forest$ros_km, data_forest$mean_BA_red,log="x",xlab="Rate-of-Spread (km/day)",ylab="Tree mortality (%)",xlim=c(0.005,30),xaxt="n",cex.axis=1.4 ,cex.lab=1.4,cex=0.8, col="black")
46 x values <= 0 omitted from logarithmic plot
axis(1,at=marks,labels=marks,cex.axis=1.4 )
points(data_test2$ros_km, data_test2$mean_BA_red,cex=0.8, col="darkgrey")
points(data_test1$ros_km, data_test1$mean_BA_red,cex=0.8, col="orange")
lines(lowess(data_forest$ros_km, data_forest$mean_BA_red, f=0.45),col="black", lwd=3)
lines(lowess(data_test1$ros_km, data_test1$mean_BA_red, f=0.45),col="darkgoldenrod3", lwd=3)
lines(lowess(data_test2$ros_km, data_test2$mean_BA_red, f=0.45),col="gray40", lwd=3)

NA
NA


quan = quantile(data_s1$ros_km,0.5)
fast = data_s1[data_s1$ros_km > quan,]
slow = data_s1[data_s1$ros_km < quan,]
fast_hum = fast[fast$human == 1,]

sum(fast$size)/sum(data_s1$size)
[1] 0.9084316
length(fast$size)/length(data_s1$size)
[1] 0.5
sum((data_s1$mean_BA_red*data_s1$size))/(sum(data_s1$size))
[1] 49.03327
mean(data_s1$mean_BA_red)
[1] 25.64874
sum(fast_hum$size, na.rm=T)/sum(fast$size)
[1] 0.4463899
length(fast_hum$size)/length(fast$size)
[1] 0.3658537
sum((fast$mean_BA_red*fast$size))/(sum(fast$size))
[1] 50.26964
mean(fast$mean_BA_red)
[1] 35.06328
sum((slow$mean_BA_red*slow$size))/(sum(slow$size))
[1] 36.76754
mean(slow$mean_BA_red)
[1] 16.2342

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Cmd+Shift+K to preview the HTML file).

The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.

```

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKVGhpcyBpcyBhbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2suIFdoZW4geW91IGV4ZWN1dGUgY29kZSB3aXRoaW4gdGhlIG5vdGVib29rLCB0aGUgcmVzdWx0cyBhcHBlYXIgYmVuZWF0aCB0aGUgY29kZS4gCgoKQWRkIGEgbmV3IGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqSW5zZXJ0IENodW5rKiBidXR0b24gb24gdGhlIHRvb2xiYXIgb3IgYnkgcHJlc3NpbmcgKkNtZCtPcHRpb24rSSouCgoKCgpgYGB7cn0KbGlicmFyeShyYXN0ZXIpCnNpemVfZGF0PXJlYWQudGFibGUoIi9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL3Byb2plY3RzL1ZJSVJTX3Jvcy9maXJlX2dyb3d0aF81ZGF5c192NC50eHQiLCBoZWFkZXI9VCwgcm93Lm5hbWVzPU5VTEwpCgpzaXplX2RhdD1hcy5kYXRhLmZyYW1lKHNpemVfZGF0KQpzaXplX2RhdD1zaXplX2RhdFstMSxdCnNpemVfZGF0PXNpemVfZGF0WywtMV0KY29sbmFtZXMoc2l6ZV9kYXQpPWMoImZpcmVuYW1lIiwieWVhciIsImNhdXNlIiwic2l6ZTEiLCJzaXplMiIsInNpemUzIiwic2l6ZTQiLCJzaXplNSIsImZpbmFsX2ZpcmVzaXplIiwibWVhbl9wcmVjaXAxIiwibWVhbl9wcmVjaXAyIiwibWVhbl9wcmVjaXAzIiwibWVhbl9wcmVjaXA0IiwibWVhbl9wcmVjaXA1IiwibWVhbl90bWF4MSIsIm1lYW5fdG1heDIiLCJtZWFuX3RtYXgzIiwibWVhbl90bWF4NCIsIm1lYW5fdG1heDUiLCJtZWFuX3RtZWFuMSIsIm1lYW5fdG1lYW4yIiwibWVhbl90bWVhbjMiLCJtZWFuX3RtZWFuNCIsIm1lYW5fdG1lYW41IiwibWVhbl92cGRtYXgxIiwibWVhbl92cGRtYXgyIiwibWVhbl92cGRtYXgzIiwibWVhbl92cGRtYXg0IiwibWVhbl92cGRtYXg1IiwibWVhbl93aW5kc3BlZWQxIiwibWVhbl93aW5kc3BlZWQyIiwibWVhbl93aW5kc3BlZWQzIiwibWVhbl93aW5kc3BlZWQ0IiwibWVhbl93aW5kc3BlZWQ1IiwibGFuZGNvdmVyIiwiZWNvc3lzdGVtIiwiYmlvbWFzcyIsImVsZXZhdGlvbiIpCgpzaXplX2RhdDIgPC0gZGF0YS5mcmFtZShsYXBwbHkoc2l6ZV9kYXQsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHgpKSkpCnNpemVfZGF0MiRodW1hbiA9IDAKc2l6ZV9kYXQyJGh1bWFuW3NpemVfZGF0MiRjYXVzZSAhPTEgJiBzaXplX2RhdDIkY2F1c2UgIT0xNCAmIHNpemVfZGF0MiRjYXVzZSAhPTE3XT0xCnNpemVfZGF0MiRodW1hbltzaXplX2RhdDIkY2F1c2UgPT0xIF09MgoKcHJvMSA9c2l6ZV9kYXQyW3doaWNoKHNpemVfZGF0MiRodW1hbiA9PSAyICYgc2l6ZV9kYXQyJGxhbmRjb3ZlciA9PSAxICksIF0KcHJvMiA9c2l6ZV9kYXQyW3doaWNoKHNpemVfZGF0MiRodW1hbiA9PSAxICYgc2l6ZV9kYXQyJGxhbmRjb3ZlciA9PSAxICksIF0KCnQudGVzdChwcm8xJHNpemUxLHBybzIkc2l6ZTEpCnQudGVzdChwcm8xJHNpemUyLHBybzIkc2l6ZTIpCnQudGVzdChwcm8xJHNpemUzLHBybzIkc2l6ZTMpCnQudGVzdChwcm8xJHNpemU0LHBybzIkc2l6ZTQpCnQudGVzdChwcm8xJHNpemU1LHBybzIkc2l6ZTUpCgoKcHJvID1zaXplX2RhdDJbd2hpY2goc2l6ZV9kYXQyJGh1bWFuID09IDEgJiBzaXplX2RhdDIkbGFuZGNvdmVyID09IDEpLCBdCmxlbmd0aChwcm8keWVhcikKYm94cGxvdChwcm8kc2l6ZTEscHJvJHNpemUyLHBybyRzaXplMyxwcm8kc2l6ZTQscHJvJHNpemU1LG5hbWVzPWMoImRheTEiLCJkYXkyIiwiZGF5MyIsImRheTQiLCJkYXk1IikseGxhYj0iIix5bGFiPSJmaXJlIHNpemUgKGttMikiLHlsaW09YygwLDUwMCksIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQoKcHJvID1zaXplX2RhdDJbd2hpY2goc2l6ZV9kYXQyJGh1bWFuID09IDIgJiBzaXplX2RhdDIkbGFuZGNvdmVyID09IDEpLCBdCmxlbmd0aChwcm8keWVhcikKYm94cGxvdChwcm8kc2l6ZTEscHJvJHNpemUyLHBybyRzaXplMyxwcm8kc2l6ZTQscHJvJHNpemU1LG5hbWVzPWMoImRheTEiLCJkYXkyIiwiZGF5MyIsImRheTQiLCJkYXk1IikseGxhYj0iIix5bGFiPSJmaXJlIHNpemUgKGttMikiLHlsaW09YygwLDUwMCksIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQoKcHJvID1zaXplX2RhdDJbd2hpY2goc2l6ZV9kYXQyJGh1bWFuID09IDEgJiBzaXplX2RhdDIkbGFuZGNvdmVyID09IDIpLCBdCmxlbmd0aChwcm8keWVhcikKYm94cGxvdChwcm8kc2l6ZTEscHJvJHNpemUyLHBybyRzaXplMyxwcm8kc2l6ZTQscHJvJHNpemU1LG5hbWVzPWMoImRheTEiLCJkYXkyIiwiZGF5MyIsImRheTQiLCJkYXk1IikseGxhYj0iIix5bGFiPSJmaXJlIHNpemUgKGttMikiLHlsaW09YygwLDUwMCksIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQoKcHJvID1zaXplX2RhdDJbd2hpY2goc2l6ZV9kYXQyJGh1bWFuID09IDIgJiBzaXplX2RhdDIkbGFuZGNvdmVyID09IDIpLCBdCmxlbmd0aChwcm8keWVhcikKYm94cGxvdChwcm8kc2l6ZTEscHJvJHNpemUyLHBybyRzaXplMyxwcm8kc2l6ZTQscHJvJHNpemU1LG5hbWVzPWMoImRheTEiLCJkYXkyIiwiZGF5MyIsImRheTQiLCJkYXk1IikseGxhYj0iIix5bGFiPSJmaXJlIHNpemUgKGttMikiLHlsaW09YygwLDUwMCksIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQpsZW5ndGgoIWlzLm5hKHBybyRzaXplNSkpCgoKCnBybyA9c2l6ZV9kYXQyW3doaWNoKHNpemVfZGF0MiRodW1hbiA9PSAxICYgc2l6ZV9kYXQyJGVjb3N5c3RlbSA9PSA2KSwgXQpsZW5ndGgocHJvJHllYXIpCmJveHBsb3QocHJvJHNpemUxLHBybyRzaXplMixwcm8kc2l6ZTMscHJvJHNpemU0LHBybyRzaXplNSxuYW1lcz1jKCJkYXkxIiwiZGF5MiIsImRheTMiLCJkYXk0IiwiZGF5NSIpLHhsYWI9IiIseWxhYj0iZmlyZSBzaXplIChrbTIpIix5bGltPWMoMCw1MDApLCBjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKCnBybyA9c2l6ZV9kYXQyW3doaWNoKHNpemVfZGF0MiRodW1hbiA9PSAyJiBzaXplX2RhdDIkZWNvc3lzdGVtID09IDYpLCBdCmxlbmd0aChwcm8keWVhcikKYm94cGxvdChwcm8kc2l6ZTEscHJvJHNpemUyLHBybyRzaXplMyxwcm8kc2l6ZTQscHJvJHNpemU1LG5hbWVzPWMoImRheTEiLCJkYXkyIiwiZGF5MyIsImRheTQiLCJkYXk1IikseGxhYj0iIix5bGFiPSJmaXJlIHNpemUgKGttMikiLHlsaW09YygwLDUwMCksIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQoKCmBgYAoKCgoKCiMjIyMjIyMjIyMjIyBwbG90IGZpcmUgc2l6ZSBtYXAgUUdJUyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpgYGB7cn0KbGlicmFyeShkYXRhLnRhYmxlKQpEVD0gZGF0YS50YWJsZShyZXMpCmZpcmVfc2l6ZSA9IERUWyAsIC5TRFt3aGljaC5taW4oZ3Jvd3RoX2ttKV0sIGJ5ID0gZmlyZW5hbWVdCgpmaXJlX3NpemUgPSBmaXJlX3NpemVbLGMoKV0Kc3ByZWFkX2xpc3QgPWxpc3QuZmlsZXModmlpcnNfZGlyLCBwYXR0ZXJuID0gIl9kYWlseS5zaHAkIiwgcmVjdXJzaXZlID0gVFJVRSwgZnVsbC5uYW1lcz1UKQppPTEKIGw9c2hhcGVmaWxlKHNwcmVhZF9saXN0W2ldKQpmb3IgKGkgaW4gMjpsZW5ndGgoc3ByZWFkX2xpc3QpKXsKICBwPXNoYXBlZmlsZShzcHJlYWRfbGlzdFtpXSkKICBsIDwtIHJiaW5kKGwsIHAsIG1ha2VVbmlxdWVJRHMgPSBUUlVFKSAKfQogbCRodW1hbiA9IDAKbCRodW1hbltsJENBVVNFICE9MSAmIGwkQ0FVU0UgIT0xNCAmIGwkQ0FVU0UgIT0xN109MQpsJGh1bWFuW2wkQ0FVU0UgPT0xIF09MgoKICAgICB3cml0ZU9HUihsLCAiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvcHJvamVjdHMvVklJUlNfcm9zLyIsIGxheWVyPSAiYWxsX2ZpcmVzIiwgZHJpdmVyPSJFU1JJIFNoYXBlZmlsZSIsIG92ZXJ3cml0ZV9sYXllciA9IFQpCgpgYGAKCgoKCgojIyMjIyBleHRyYWN0IG51bWJlciBhbmQgc2l6ZSBzdGF0aXN0aWNzIGZyb20gZnJhcCAgICMjIyMjIyMjIyMjIyMjIyMKYGBge3J9CmxpYnJhcnkocmFzdGVyKQoKZHIgPXNoYXBlZmlsZSgiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvcHJvamVjdHMvVklJUlNfcm9zL2ZyYXBfc3Vic2V0LnNocCIpCmRyMSA9c2hhcGVmaWxlKCIvVXNlcnMvc3Rpam5oYW50c29uL0RvY3VtZW50cy9kYXRhL0ZSQVAvZmlyZTE4XzEuc2hwIikKZHIxJFlFQVJfPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRyMSRZRUFSXykpCmRyMSRTaGFwZV9BcmVhPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRyMSRTaGFwZV9BcmVhKSkKZHIxPWRyMVshaXMubmEoZHIxJFlFQVJfKSwgXQpkcjE9ZHIxW2RyMSRZRUFSXz4yMDExLF0Kc3VtKGRyMSRTaGFwZV9BcmVhKQpzdW0oZHIkU2hhcGVfQXJlYSkKYGBgCjEpIGZyYXAgCjIpIG9ubHkgZmlyZSBncm93dGggZGF0YXNldHMKCi0gcHJlcGFyZSBmaW5hbCBkYXRhc2V0IHRvIG9wZW4KYGBge3J9CgpkYWlseV9yZXM9cmVhZC50YWJsZSgiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvcHJvamVjdHMvVklJUlNfcm9zL2ZpbmFsX2RhdGFzZXRfVjMudHh0IixoZWFkZXI9VCkKCnJlcz1hcy5kYXRhLmZyYW1lKGRhaWx5X3JlcykKCnJlcyRtZWFuX3JvcyA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJG1lYW5fcm9zKSkKcmVzJG1heF9yb3MgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyRtYXhfcm9zKSkKcmVzJG1lZGlhbjk1X3JvcyA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJG1lZGlhbjk1X3JvcykpCnJlcyRiaSA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJGJpKSkKcmVzJGVyYyA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJGVyYykpCnJlcyRldHIgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyRldHIpKQpyZXMkZm0xMDAgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyRmbTEwMCkpCnJlcyRmbTEwMDAgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyRmbTEwMDApKQpyZXMkcGV0ID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkcGV0KSkKcmVzJHByID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkcHIpKQpyZXMkcm1heCA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJHJtYXgpKQpyZXMkcm1pbiA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJHJtaW4pKQpyZXMkdGggPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyR0aCkpCnJlcyR0bW1uID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkdG1tbikpCnJlcyR0bW14ID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkdG1teCkpCnJlcyR2cGQgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyR2cGQpKQojcmVzJHdzID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkd3MpKQpyZXMkdnMgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyR2cykpCnJlcyRncm93dGggPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyRncm93dGgpKQpyZXMkdG90YWxfYXJlYSA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJHRvdGFsX2FyZWEpKQpyZXMkbWVhbl9mcnAgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyRtZWFuX2ZycCkpCnJlcyRmcnBfOTUgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyRmcnBfOTUpKQpyZXMkbWF4X2xhbmQgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyRtYXhfbGFuZCkpCnJlcyRtZWFuX2xhbmQgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyRtZWFuX2xhbmQpKQpyZXMkYmlvbWFzcyA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJGJpb21hc3MpKQpyZXMkeWVhciA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJHllYXIpKQpyZXMkbW9udGggPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyRtb250aCkpCnJlcyRkb3lfb3V0ID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkZG95X291dCkpCgpyZXMgPSByZXNbLTEsXQpyZXMkcGVyX2JhID0gcmVzJGdyb3d0aC9yZXMkdG90YWxfYXJlYQpyZXMkZ3Jvd3RoX2ttID1yZXMkZ3Jvd3RoLzEwMDAwMDAKCnJlcyRodW1hbiA9IDAKcmVzJGh1bWFuW3JlcyRjYXVzZSAhPTEgJiByZXMkY2F1c2UgIT0xNCAmIHJlcyRjYXVzZSAhPTE3XT0xCnJlcyRodW1hbltyZXMkY2F1c2UgPT0xIF09MgoKcmVzJHJvc19rbSA9IChyZXMkbWVkaWFuOTVfcm9zKjI0KS8xMDAwCnJlcyRyb3NfbWVhbl9rbSA9IChyZXMkbWVhbl9yb3MqMjQpLzEwMDAKCmBgYAoKIyMjIyMjIyBwbG90IG1lYW4gdnMgbWF4IGZpcmUgcmF0ZS1vZi1zcHJlYWQgIyMjIyMjIyMjIyMjIyMjIyMjCmBgYHtyfQojc3VtbWFyeShyZXMpCnBsb3QocmVzJHJvc19rbSxyZXMkcm9zX21lYW5fa20sIHhsYWI9Im1heGltdW0gZmlyZS1zcHJlYWQtcmF0ZSAoa20vZGF5Iix5bGFiPSJtZWFuIGZpcmUtc3ByZWFkLXJhdGUgKGttL2RheSkiKQoKCnRpZmYoIi9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL0RvY3VtZW50cy9hcnRpY3Vsb3MvZW5fcHJvY2Vzby9WSUlSU19yb3MvbWVhbl92c19tYXhfcm9zX3YxLnRpZiIsIHdpZHRoID0gNSwgaGVpZ2h0ID0gNSwgdW5pdHMgPSAnaW4nLCByZXMgPSAzMDApCnBsb3QocmVzJHJvc19rbSxyZXMkcm9zX21lYW5fa20sIHhsaW09YygwLDI1KSx5bGltPWMoMCwxMCksIHhsYWI9Im1heGltdW0gZmlyZSByYXRlLW9mLXNwcmVhZCAoa20vZGF5KSIseWxhYj0ibWVhbiBmaXJlIHJhdGUtb2Ytc3ByZWFkIChrbS9kYXkpIiwgY2V4LmxhYj0xLjMsY2V4LmF4aXMgPSAxLjI1KQpkZXYub2ZmKCkKCmBgYAoKCgojIyMjIyMjIyMjIyMgZGlmZmVyZW5jZSBiZXR3ZWVuIGh1bWFuIGFuZCBsaWdodG5pZ24gZmlyZXMgIyMjIyMjIyMjIyMjIyMjIyMKCmBgYHtyfQptZT0wCm1lMT0wCmRheXMgPSBjKCJkYXkxIiwiZGF5MiIsImRheTMiLCJkYXk0IiwiZGF5NSIpCnBybzEgPSByZXNbcmVzJGZpcmVfZGF5ID09IDEgJiByZXMkaHVtYW4gPT0gMSxdCnBybzIgPSByZXNbcmVzJGZpcmVfZGF5ID09IDIgJiByZXMkaHVtYW4gPT0gMSxdCnBybzMgPSByZXNbcmVzJGZpcmVfZGF5ID09IDMgJiByZXMkaHVtYW4gPT0gMSxdCnBybzQgPSByZXNbcmVzJGZpcmVfZGF5ID09IDQgJiByZXMkaHVtYW4gPT0gMSxdCnBybzUgPSByZXNbcmVzJGZpcmVfZGF5ID09IDUgJiByZXMkaHVtYW4gPT0gMSxdCm1lWzFdID1tZWFuKHBybzEkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbMl0gPW1lYW4ocHJvMiRncm93dGhfa20sbmEub21pdD1UKQptZVszXSA9bWVhbihwcm8zJGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lWzRdID1tZWFuKHBybzQkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbNV0gPW1lYW4ocHJvNSRncm93dGhfa20sbmEub21pdD1UKQoKcHJvMWggPSByZXNbcmVzJGZpcmVfZGF5ID09IDEgJiByZXMkaHVtYW4gPT0gMixdCnBybzJoID0gcmVzW3JlcyRmaXJlX2RheSA9PSAyICYgcmVzJGh1bWFuID09IDIsXQpwcm8zaCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMyAmIHJlcyRodW1hbiA9PSAyLF0KcHJvNGggPSByZXNbcmVzJGZpcmVfZGF5ID09IDQgJiByZXMkaHVtYW4gPT0gMixdCnBybzVoID0gcmVzW3JlcyRmaXJlX2RheSA9PSA1ICYgcmVzJGh1bWFuID09IDIsXQptZTFbMV0gPW1lYW4ocHJvMWgkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWUxWzJdID1tZWFuKHBybzJoJGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lMVszXSA9bWVhbihwcm8zaCRncm93dGhfa20sbmEub21pdD1UKQptZTFbNF0gPW1lYW4ocHJvNGgkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWUxWzVdID1tZWFuKHBybzVoJGdyb3d0aF9rbSxuYS5vbWl0PVQpCgpib3hwbG90KHBybzEkZ3Jvd3RoX2ttLHBybzIkZ3Jvd3RoX2ttLHBybzMkZ3Jvd3RoX2ttLHBybzQkZ3Jvd3RoX2ttLHBybzUkZ3Jvd3RoX2ttLG5hbWVzPWMoImRheTEiLCJkYXkyIiwiZGF5MyIsImRheTQiLCJkYXk1IikseGxhYj0iIix5bGFiPSJmaXJlIHNpemUgKGttMikiLHlsaW09YygwLDI1MCksIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQoKYm94cGxvdChwcm8xaCRncm93dGhfa20scHJvMmgkZ3Jvd3RoX2ttLHBybzNoJGdyb3d0aF9rbSxwcm80aCRncm93dGhfa20scHJvNWgkZ3Jvd3RoX2ttLG5hbWVzPWMoImRheTEiLCJkYXkyIiwiZGF5MyIsImRheTQiLCJkYXk1IikseGxhYj0iIix5bGFiPSJmaXJlIHNpemUgKGttMikiLHlsaW09YygwLDI1MCksIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQoKdGlmZigiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvRG9jdW1lbnRzL2FydGljdWxvcy9lbl9wcm9jZXNvL1ZJSVJTX3Jvcy9maWd1cmUxX3YxLnRpZiIsIHdpZHRoID0gMTAsIGhlaWdodCA9IDUsIHVuaXRzID0gJ2luJywgcmVzID0gMzAwKQpwYXIobWZyb3c9YygxLDIpKQpwYXIobWFyPWMoNCwgNCwgMSwwLjEpKQpwYXIobWdwPWMoMi4zLDEsMCkpCmJveHBsb3QocHJvMSRncm93dGhfa20scHJvMiRncm93dGhfa20scHJvMyRncm93dGhfa20scHJvNCRncm93dGhfa20scHJvNSRncm93dGhfa20sbmFtZXM9YygiMSIsIjIiLCIzIiwiNCIsIjUiKSx4bGFiPSJEYXkgc2luY2UgZmlyZSBzdGFydCIseWxhYj0gZXhwcmVzc2lvbignRmlyZSBzaXplIChrbSdeLTEqJyknKSx5bGltPWMoMCwyMDApLCBjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKYm94cGxvdChwcm8xaCRncm93dGhfa20scHJvMmgkZ3Jvd3RoX2ttLHBybzNoJGdyb3d0aF9rbSxwcm80aCRncm93dGhfa20scHJvNWgkZ3Jvd3RoX2ttLG5hbWVzPWMoIjEiLCIyIiwiMyIsIjQiLCI1IikseGxhYj0iRGF5IHNpbmNlIGZpcmUgc3RhcnQiLHlsYWI9ICIiLHlsaW09YygwLDIwMCksIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQpkZXYub2ZmKCkKCnRpZmYoIi9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL0RvY3VtZW50cy9hcnRpY3Vsb3MvZW5fcHJvY2Vzby9WSUlSU19yb3Mvc3VwX2ZpZ3VyZTFfdjEudGlmIiwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gNSwgdW5pdHMgPSAnaW4nLCByZXMgPSAzMDApCnBhcihtZnJvdz1jKDEsMikpCnBhcihtYXI9Yyg0LCA0LCAxLDAuMSkpCnBhcihtZ3A9YygyLjMsMSwwKSkKYm94cGxvdChwcm8xJGdyb3d0aF9rbSxwcm8yJGdyb3d0aF9rbSxwcm8zJGdyb3d0aF9rbSxwcm80JGdyb3d0aF9rbSxwcm81JGdyb3d0aF9rbSxuYW1lcz1jKCIxIiwiMiIsIjMiLCI0IiwiNSIpLHhsYWI9IkRheSBzaW5jZSBmaXJlIHN0YXJ0Iix5bGFiPSBleHByZXNzaW9uKCdGaXJlIHNpemUgKGttJ14tMSonKScpLHlsaW09YygwLDcwMCksIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQpib3hwbG90KHBybzFoJGdyb3d0aF9rbSxwcm8yaCRncm93dGhfa20scHJvM2gkZ3Jvd3RoX2ttLHBybzRoJGdyb3d0aF9rbSxwcm81aCRncm93dGhfa20sbmFtZXM9YygiMSIsIjIiLCIzIiwiNCIsIjUiKSx4bGFiPSJEYXkgc2luY2UgZmlyZSBzdGFydCIseWxhYj0gIiIseWxpbT1jKDAsNzAwKSwgY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCmRldi5vZmYoKSAKCgpwYXIobWdwPWMoMi4zLDEsMCkpICAKcGxvdChtZSx0eXBlPSJvIiwgeWxpbT1jKDAsMTUwKSx5bGFiPWV4cHJlc3Npb24oImZpcmUgc2l6ZSAoa20iXjIqIikiKSx4bGFiPSIiLCB4YXh0PSduJywgbHR5ID0gMSwgbHdkID0gMixjZXgubGFiPTEuMikKYXhpcyhzaWRlPTEsIGF0PWMoMTo1KSxsYWJlbHM9ZGF5cykKcG9pbnRzKG1lMSx0eXBlPSJvIixsdHkgPSAyLCBsd2QgPSAyKQoKdC50ZXN0KGxvZyhwcm8xJGdyb3d0aF9rbSksbG9nKHBybzFoJGdyb3d0aF9rbSkpCnQudGVzdChsb2cocHJvMiRncm93dGhfa20pLGxvZyhwcm8yaCRncm93dGhfa20pKQp0LnRlc3QobG9nKHBybzMkZ3Jvd3RoX2ttKSxsb2cocHJvM2gkZ3Jvd3RoX2ttKSkKdC50ZXN0KGxvZyhwcm80JGdyb3d0aF9rbSksbG9nKHBybzRoJGdyb3d0aF9rbSkpCnQudGVzdChsb2cocHJvNSRncm93dGhfa20pLGxvZyhwcm81aCRncm93dGhfa20pKQoKCmBgYAoKIyMjIyMjIyMjIyMjIyMjIyMjMyBmb3Igd2VzdGVybiBjb3JkaWxsZXJhIGVjb3JlZ2lvbiAgIyMjIyMjIyMjIyMjIyMjIyMjCmBgYHtyfQptZT0wCm1lMT0wCnBybzEgPSByZXNbcmVzJGZpcmVfZGF5ID09IDEgJiByZXMkaHVtYW4gPT0gMSAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQpwcm8yID0gcmVzW3JlcyRmaXJlX2RheSA9PSAyICYgcmVzJGh1bWFuID09IDEgJiAocmVzJGVjbzEgPT0gNiB8IHJlcyRlY28xID09IDcpLF0KcHJvMyA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMyAmIHJlcyRodW1hbiA9PSAxICYgKHJlcyRlY28xID09IDYgfCByZXMkZWNvMSA9PSA3KSxdCnBybzQgPSByZXNbcmVzJGZpcmVfZGF5ID09IDQgJiByZXMkaHVtYW4gPT0gMSAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQpwcm81ID0gcmVzW3JlcyRmaXJlX2RheSA9PSA1ICYgcmVzJGh1bWFuID09IDEgJiAocmVzJGVjbzEgPT0gNiB8IHJlcyRlY28xID09IDcpLF0KCmJveHBsb3QocHJvMSRncm93dGhfa20scHJvMiRncm93dGhfa20scHJvMyRncm93dGhfa20scHJvNCRncm93dGhfa20scHJvNSRncm93dGhfa20sbmFtZXM9YygiZGF5MSIsImRheTIiLCJkYXkzIiwiZGF5NCIsImRheTUiKSx4bGFiPSIiLHlsYWI9ImZpcmUgc2l6ZSAoa20yKSIseWxpbT1jKDAsMjUwKSwgY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCgpwcm8xaCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMSAmIHJlcyRodW1hbiA9PSAyICYgKHJlcyRlY28xID09IDYgfCByZXMkZWNvMSA9PSA3KSxdCnBybzJoID0gcmVzW3JlcyRmaXJlX2RheSA9PSAyICYgcmVzJGh1bWFuID09IDIgJiAocmVzJGVjbzEgPT0gNiB8IHJlcyRlY28xID09IDcpLF0KcHJvM2ggPSByZXNbcmVzJGZpcmVfZGF5ID09IDMgJiByZXMkaHVtYW4gPT0gMiAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQpwcm80aCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gNCAmIHJlcyRodW1hbiA9PSAyICYgKHJlcyRlY28xID09IDYgfCByZXMkZWNvMSA9PSA3KSxdCnBybzVoID0gcmVzW3JlcyRmaXJlX2RheSA9PSA1ICYgcmVzJGh1bWFuID09IDIgJiAocmVzJGVjbzEgPT0gNiB8IHJlcyRlY28xID09IDcpLF0KCmJveHBsb3QocHJvMWgkZ3Jvd3RoX2ttLHBybzJoJGdyb3d0aF9rbSxwcm8zaCRncm93dGhfa20scHJvNGgkZ3Jvd3RoX2ttLHBybzVoJGdyb3d0aF9rbSxuYW1lcz1jKCJkYXkxIiwiZGF5MiIsImRheTMiLCJkYXk0IiwiZGF5NSIpLHhsYWI9IiIseWxhYj0iZmlyZSBzaXplIChrbTIpIix5bGltPWMoMCwyNTApLCBjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKCm1lWzFdID1tZWFuKHBybzEkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbMl0gPW1lYW4ocHJvMiRncm93dGhfa20sbmEub21pdD1UKQptZVszXSA9bWVhbihwcm8zJGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lWzRdID1tZWFuKHBybzQkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbNV0gPW1lYW4ocHJvNSRncm93dGhfa20sbmEub21pdD1UKQoKbWUxWzFdID1tZWFuKHBybzFoJGdyb3d0aF9rbSxuYS5ybT1UKQptZTFbMl0gPW1lYW4ocHJvMmgkZ3Jvd3RoX2ttLG5hLnJtPVQpCm1lMVszXSA9bWVhbihwcm8zaCRncm93dGhfa20sbmEucm09VCkKbWUxWzRdID1tZWFuKHBybzRoJGdyb3d0aF9rbSxuYS5ybT1UKQptZTFbNV0gPW1lYW4ocHJvNWgkZ3Jvd3RoX2ttLG5hLnJtPVQpCgoKcGFyKG1ncD1jKDIuMywxLDApKSAgCnBsb3QobWUsdHlwZT0ibyIsIHlsaW09YygwLDE1MCkseWxhYj1leHByZXNzaW9uKCJmaXJlIHNpemUgKGttIl4yKiIpIikseGxhYj0iIiwgeGF4dD0nbicsIGx0eSA9IDEsIGx3ZCA9IDIsY2V4LmxhYj0xLjIpCmF4aXMoc2lkZT0xLCBhdD1jKDE6NSksbGFiZWxzPWRheXMpCnBvaW50cyhtZTEsdHlwZT0ibyIsbHR5ID0gMiwgbHdkID0gMikKCnQudGVzdChsb2cocHJvMSRncm93dGhfa20pLGxvZyhwcm8xaCRncm93dGhfa20pKQp0LnRlc3QobG9nKHBybzIkZ3Jvd3RoX2ttKSxsb2cocHJvMmgkZ3Jvd3RoX2ttKSkKdC50ZXN0KGxvZyhwcm8zJGdyb3d0aF9rbSksbG9nKHBybzNoJGdyb3d0aF9rbSkpCnQudGVzdChsb2cocHJvNCRncm93dGhfa20pLGxvZyhwcm80aCRncm93dGhfa20pKQp0LnRlc3QobG9nKHBybzUkZ3Jvd3RoX2ttKSxsb2cocHJvNWgkZ3Jvd3RoX2ttKSkKCm1lYW4ocHJvMSRncm93dGhfa20sbmEub21pdD1UKQptZWFuKHBybzFoJGdyb3d0aF9rbSxuYS5ybT1UKQoKYGBgCgojIyMjIyMjIyMjIyMjIyMjIyMgZm9yIG1lZGl0ZXJhbmVhbiBjYWxpZm9ybmlhICAjIyMjIyMjIyMjIyMjIyMjIyMKCmBgYHtyfQpwcm8xID0gcmVzW3JlcyRmaXJlX2RheSA9PSAxICYgcmVzJGh1bWFuID09IDEgJiAocmVzJGVjbzEgPT0gMTEpLF0KcHJvMiA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMiAmIHJlcyRodW1hbiA9PSAxICYgKHJlcyRlY28xID09IDExKSxdCnBybzMgPSByZXNbcmVzJGZpcmVfZGF5ID09IDMgJiByZXMkaHVtYW4gPT0gMSAmIChyZXMkZWNvMSA9PSAxMSksXQpwcm80ID0gcmVzW3JlcyRmaXJlX2RheSA9PSA0ICYgcmVzJGh1bWFuID09IDEgJiAocmVzJGVjbzEgPT0gMTEpLF0KcHJvNSA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gNSAmIHJlcyRodW1hbiA9PSAxICYgKHJlcyRlY28xID09IDExKSxdCgpib3hwbG90KHBybzEkZ3Jvd3RoX2ttLHBybzIkZ3Jvd3RoX2ttLHBybzMkZ3Jvd3RoX2ttLHBybzQkZ3Jvd3RoX2ttLHBybzUkZ3Jvd3RoX2ttLG5hbWVzPWMoImRheTEiLCJkYXkyIiwiZGF5MyIsImRheTQiLCJkYXk1IikseGxhYj0iIix5bGFiPSJmaXJlIHNpemUgKGttMikiLHlsaW09YygwLDMwMCksIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQoKcHJvMWggPSByZXNbcmVzJGZpcmVfZGF5ID09IDEgJiByZXMkaHVtYW4gPT0gMiAmIChyZXMkZWNvMSA9PSAxMSksXQpwcm8yaCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMiAmIHJlcyRodW1hbiA9PSAyICYgKHJlcyRlY28xID09IDExKSxdCnBybzNoID0gcmVzW3JlcyRmaXJlX2RheSA9PSAzICYgcmVzJGh1bWFuID09IDIgJiAocmVzJGVjbzEgPT0gMTEpLF0KcHJvNGggPSByZXNbcmVzJGZpcmVfZGF5ID09IDQgJiByZXMkaHVtYW4gPT0gMiAmIChyZXMkZWNvMSA9PSAxMSksXQpwcm81aCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gNSAmIHJlcyRodW1hbiA9PSAyICYgKHJlcyRlY28xID09IDExKSxdCgpib3hwbG90KHBybzFoJGdyb3d0aF9rbSxwcm8yaCRncm93dGhfa20scHJvM2gkZ3Jvd3RoX2ttLHBybzRoJGdyb3d0aF9rbSxwcm81aCRncm93dGhfa20sbmFtZXM9YygiZGF5MSIsImRheTIiLCJkYXkzIiwiZGF5NCIsImRheTUiKSx4bGFiPSIiLHlsYWI9ImZpcmUgc2l6ZSAoa20yKSIseWxpbT1jKDAsMzAwKSwgY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCgptZVsxXSA9bWVhbihwcm8xJGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lWzJdID1tZWFuKHBybzIkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbM10gPW1lYW4ocHJvMyRncm93dGhfa20sbmEub21pdD1UKQptZVs0XSA9bWVhbihwcm80JGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lWzVdID1tZWFuKHBybzUkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKCm1lMVsxXSA9bWVhbihwcm8xaCRncm93dGhfa20sbmEucm09VCkKbWUxWzJdID1tZWFuKHBybzJoJGdyb3d0aF9rbSxuYS5ybT1UKQptZTFbM10gPW1lYW4ocHJvM2gkZ3Jvd3RoX2ttLG5hLnJtPVQpCm1lMVs0XSA9bWVhbihwcm80aCRncm93dGhfa20sbmEucm09VCkKbWUxWzVdID1tZWFuKHBybzVoJGdyb3d0aF9rbSxuYS5ybT1UKQoKCnBhcihtZ3A9YygyLjMsMSwwKSkgIApwbG90KG1lLHR5cGU9Im8iLCB5bGltPWMoMCwxNTApLHlsYWI9ZXhwcmVzc2lvbigiZmlyZSBzaXplIChrbSJeMioiKSIpLHhsYWI9IiIsIHhheHQ9J24nLCBsdHkgPSAxLCBsd2QgPSAyLGNleC5sYWI9MS4yKQpheGlzKHNpZGU9MSwgYXQ9YygxOjUpLGxhYmVscz1kYXlzKQpwb2ludHMobWUxLHR5cGU9Im8iLGx0eSA9IDIsIGx3ZCA9IDIpCgpgYGAKIyMjIyMjIyMjIyMjIyMjIyMjIGZvciBkaWZmZXJlbmNlIGluIGF1dHVtbiAgIyMjIyMjIyMjIyMjIyMjIyMjCmBgYHtyfQpwcm8xID0gcmVzW3JlcyRmaXJlX2RheSA9PSAxICYgcmVzJGh1bWFuID09IDEgJiByZXMkbW9udGggPjgsXQpwcm8yID0gcmVzW3JlcyRmaXJlX2RheSA9PSAyICYgcmVzJGh1bWFuID09IDEgJiByZXMkbW9udGggPjgsXQpwcm8zID0gcmVzW3JlcyRmaXJlX2RheSA9PSAzICYgcmVzJGh1bWFuID09IDEgJiByZXMkbW9udGggPjgsXQpwcm80ID0gcmVzW3JlcyRmaXJlX2RheSA9PSA0ICYgcmVzJGh1bWFuID09IDEgJiByZXMkbW9udGggPjgsXQpwcm81ID0gcmVzW3JlcyRmaXJlX2RheSA9PSA1ICYgcmVzJGh1bWFuID09IDEgJiByZXMkbW9udGggPjgsXQoKYm94cGxvdChwcm8xJGdyb3d0aF9rbSxwcm8yJGdyb3d0aF9rbSxwcm8zJGdyb3d0aF9rbSxwcm80JGdyb3d0aF9rbSxwcm81JGdyb3d0aF9rbSxuYW1lcz1jKCJkYXkxIiwiZGF5MiIsImRheTMiLCJkYXk0IiwiZGF5NSIpLHhsYWI9IiIseWxhYj0iZmlyZSBzaXplIChrbTIpIix5bGltPWMoMCwzMDApLCBjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKCnBybzFoID0gcmVzW3JlcyRmaXJlX2RheSA9PSAxICYgcmVzJGh1bWFuID09IDIgJiByZXMkbW9udGggPjgsXQpwcm8yaCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMiAmIHJlcyRodW1hbiA9PSAyICYgcmVzJG1vbnRoID44LF0KcHJvM2ggPSByZXNbcmVzJGZpcmVfZGF5ID09IDMgJiByZXMkaHVtYW4gPT0gMiAmIHJlcyRtb250aCA+OCxdCnBybzRoID0gcmVzW3JlcyRmaXJlX2RheSA9PSA0ICYgcmVzJGh1bWFuID09IDIgJiByZXMkbW9udGggPjgsXQpwcm81aCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gNSAmIHJlcyRodW1hbiA9PSAyICYgcmVzJG1vbnRoID44LF0KCmJveHBsb3QocHJvMWgkZ3Jvd3RoX2ttLHBybzJoJGdyb3d0aF9rbSxwcm8zaCRncm93dGhfa20scHJvNGgkZ3Jvd3RoX2ttLHBybzVoJGdyb3d0aF9rbSxuYW1lcz1jKCJkYXkxIiwiZGF5MiIsImRheTMiLCJkYXk0IiwiZGF5NSIpLHhsYWI9IiIseWxhYj0iZmlyZSBzaXplIChrbTIpIix5bGltPWMoMCwzMDApLCBjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKCm1lWzFdID1tZWFuKHBybzEkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbMl0gPW1lYW4ocHJvMiRncm93dGhfa20sbmEub21pdD1UKQptZVszXSA9bWVhbihwcm8zJGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lWzRdID1tZWFuKHBybzQkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbNV0gPW1lYW4ocHJvNSRncm93dGhfa20sbmEub21pdD1UKQoKbWUxWzFdID1tZWFuKHBybzFoJGdyb3d0aF9rbSxuYS5ybT1UKQptZTFbMl0gPW1lYW4ocHJvMmgkZ3Jvd3RoX2ttLG5hLnJtPVQpCm1lMVszXSA9bWVhbihwcm8zaCRncm93dGhfa20sbmEucm09VCkKbWUxWzRdID1tZWFuKHBybzRoJGdyb3d0aF9rbSxuYS5ybT1UKQptZTFbNV0gPW1lYW4ocHJvNWgkZ3Jvd3RoX2ttLG5hLnJtPVQpCgoKcGFyKG1ncD1jKDIuMywxLDApKSAgCnBsb3QobWUsdHlwZT0ibyIsIHlsaW09YygwLDE1MCkseWxhYj1leHByZXNzaW9uKCJmaXJlIHNpemUgKGttIl4yKiIpIikseGxhYj0iIiwgeGF4dD0nbicsIGx0eSA9IDEsIGx3ZCA9IDIsY2V4LmxhYj0xLjIpCmF4aXMoc2lkZT0xLCBhdD1jKDE6NSksbGFiZWxzPWRheXMpCnBvaW50cyhtZTEsdHlwZT0ibyIsbHR5ID0gMiwgbHdkID0gMikKCmBgYAoKIyMjIyMjIyMjIyMjIyMjIyMjIGZvciBkaWZmZXJlbmNlIGluIHN1bW1lciAgIyMjIyMjIyMjIyMjIyMjIyMjCgpgYGB7cn0KcHJvMSA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMSAmIHJlcyRodW1hbiA9PSAxICYgcmVzJG1vbnRoIDw9OCAsXQpwcm8yID0gcmVzW3JlcyRmaXJlX2RheSA9PSAyICYgcmVzJGh1bWFuID09IDEgJiByZXMkbW9udGggPD04LF0KcHJvMyA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMyAmIHJlcyRodW1hbiA9PSAxICYgcmVzJG1vbnRoIDw9OCxdCnBybzQgPSByZXNbcmVzJGZpcmVfZGF5ID09IDQgJiByZXMkaHVtYW4gPT0gMSAmIHJlcyRtb250aCA8PTgsXQpwcm81ID0gcmVzW3JlcyRmaXJlX2RheSA9PSA1ICYgcmVzJGh1bWFuID09IDEgJiByZXMkbW9udGggPD04LF0KCmJveHBsb3QocHJvMSRncm93dGhfa20scHJvMiRncm93dGhfa20scHJvMyRncm93dGhfa20scHJvNCRncm93dGhfa20scHJvNSRncm93dGhfa20sbmFtZXM9YygiZGF5MSIsImRheTIiLCJkYXkzIiwiZGF5NCIsImRheTUiKSx4bGFiPSIiLHlsYWI9ImZpcmUgc2l6ZSAoa20yKSIseWxpbT1jKDAsMzAwKSwgY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCgpwcm8xaCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMSAmIHJlcyRodW1hbiA9PSAyICYgcmVzJG1vbnRoIDw9OCxdCnBybzJoID0gcmVzW3JlcyRmaXJlX2RheSA9PSAyICYgcmVzJGh1bWFuID09IDIgJiByZXMkbW9udGggPD04LF0KcHJvM2ggPSByZXNbcmVzJGZpcmVfZGF5ID09IDMgJiByZXMkaHVtYW4gPT0gMiAmIHJlcyRtb250aCA8PTgsXQpwcm80aCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gNCAmIHJlcyRodW1hbiA9PSAyICYgcmVzJG1vbnRoIDw9OCxdCnBybzVoID0gcmVzW3JlcyRmaXJlX2RheSA9PSA1ICYgcmVzJGh1bWFuID09IDIgJiByZXMkbW9udGggPD04LF0KCmJveHBsb3QocHJvMWgkZ3Jvd3RoX2ttLHBybzJoJGdyb3d0aF9rbSxwcm8zaCRncm93dGhfa20scHJvNGgkZ3Jvd3RoX2ttLHBybzVoJGdyb3d0aF9rbSxuYW1lcz1jKCJkYXkxIiwiZGF5MiIsImRheTMiLCJkYXk0IiwiZGF5NSIpLHhsYWI9IiIseWxhYj0iZmlyZSBzaXplIChrbTIpIix5bGltPWMoMCwzMDApLCBjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKCm1lWzFdID1tZWFuKHBybzEkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbMl0gPW1lYW4ocHJvMiRncm93dGhfa20sbmEub21pdD1UKQptZVszXSA9bWVhbihwcm8zJGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lWzRdID1tZWFuKHBybzQkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbNV0gPW1lYW4ocHJvNSRncm93dGhfa20sbmEub21pdD1UKQoKbWUxWzFdID1tZWFuKHBybzFoJGdyb3d0aF9rbSxuYS5ybT1UKQptZTFbMl0gPW1lYW4ocHJvMmgkZ3Jvd3RoX2ttLG5hLnJtPVQpCm1lMVszXSA9bWVhbihwcm8zaCRncm93dGhfa20sbmEucm09VCkKbWUxWzRdID1tZWFuKHBybzRoJGdyb3d0aF9rbSxuYS5ybT1UKQptZTFbNV0gPW1lYW4ocHJvNWgkZ3Jvd3RoX2ttLG5hLnJtPVQpCgoKcGFyKG1ncD1jKDIuMywxLDApKSAgCnBsb3QobWUsdHlwZT0ibyIsIHlsaW09YygwLDE1MCkseWxhYj1leHByZXNzaW9uKCJmaXJlIHNpemUgKGttIl4yKiIpIikseGxhYj0iIiwgeGF4dD0nbicsIGx0eSA9IDEsIGx3ZCA9IDIsY2V4LmxhYj0xLjIpCmF4aXMoc2lkZT0xLCBhdD1jKDE6NSksbGFiZWxzPWRheXMpCnBvaW50cyhtZTEsdHlwZT0ibyIsbHR5ID0gMiwgbHdkID0gMikKCgpgYGAKCiMjIyMjIyMjIyMjIyMjIyMjIyBmb3IgZGlmZmVyZW5jZSBpbiBzdW1tZXIgaW4gd2VzdGVybiBjb3JkaWxsZXJhICAjIyMjIyMjIyMjIyMjIyMjIyMKCmBgYHtyfQpwcm8xID0gcmVzW3JlcyRmaXJlX2RheSA9PSAxICYgcmVzJGh1bWFuID09IDEgJiAoIHJlcyRtb250aCA8PTggJiByZXMkbW9udGggPjUgKSAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQpwcm8yID0gcmVzW3JlcyRmaXJlX2RheSA9PSAyICYgcmVzJGh1bWFuID09IDEgJiAoIHJlcyRtb250aCA8PTggJiByZXMkbW9udGggPjUgKSAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQpwcm8zID0gcmVzW3JlcyRmaXJlX2RheSA9PSAzICYgcmVzJGh1bWFuID09IDEgJiAoIHJlcyRtb250aCA8PTggJiByZXMkbW9udGggPjUgKSAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQpwcm80ID0gcmVzW3JlcyRmaXJlX2RheSA9PSA0ICYgcmVzJGh1bWFuID09IDEgJiAoIHJlcyRtb250aCA8PTggJiByZXMkbW9udGggPjUgKSAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQpwcm81ID0gcmVzW3JlcyRmaXJlX2RheSA9PSA1ICYgcmVzJGh1bWFuID09IDEgJiAoIHJlcyRtb250aCA8PTggJiByZXMkbW9udGggPjUgKSAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQoKYm94cGxvdChwcm8xJGdyb3d0aF9rbSxwcm8yJGdyb3d0aF9rbSxwcm8zJGdyb3d0aF9rbSxwcm80JGdyb3d0aF9rbSxwcm81JGdyb3d0aF9rbSxuYW1lcz1jKCJkYXkxIiwiZGF5MiIsImRheTMiLCJkYXk0IiwiZGF5NSIpLHhsYWI9IiIseWxhYj0iZmlyZSBzaXplIChrbTIpIix5bGltPWMoMCwzMDApLCBjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKCnBybzFoID0gcmVzW3JlcyRmaXJlX2RheSA9PSAxICYgcmVzJGh1bWFuID09IDIgJiAoIHJlcyRtb250aCA8PTggJiByZXMkbW9udGggPjUgKSAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQpwcm8yaCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMiAmIHJlcyRodW1hbiA9PSAyICYgKCByZXMkbW9udGggPD04ICYgcmVzJG1vbnRoID41ICkgJiAocmVzJGVjbzEgPT0gNiB8IHJlcyRlY28xID09IDcpLF0KcHJvM2ggPSByZXNbcmVzJGZpcmVfZGF5ID09IDMgJiByZXMkaHVtYW4gPT0gMiAmICggcmVzJG1vbnRoIDw9OCAmIHJlcyRtb250aCA+NSApICYgKHJlcyRlY28xID09IDYgfCByZXMkZWNvMSA9PSA3KSxdCnBybzRoID0gcmVzW3JlcyRmaXJlX2RheSA9PSA0ICYgcmVzJGh1bWFuID09IDIgJiAoIHJlcyRtb250aCA8PTggJiByZXMkbW9udGggPjUgKSAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQpwcm81aCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gNSAmIHJlcyRodW1hbiA9PSAyICYgKCByZXMkbW9udGggPD04ICYgcmVzJG1vbnRoID41ICkgJiAocmVzJGVjbzEgPT0gNiB8IHJlcyRlY28xID09IDcpLF0KCmJveHBsb3QocHJvMWgkZ3Jvd3RoX2ttLHBybzJoJGdyb3d0aF9rbSxwcm8zaCRncm93dGhfa20scHJvNGgkZ3Jvd3RoX2ttLHBybzVoJGdyb3d0aF9rbSxuYW1lcz1jKCJkYXkxIiwiZGF5MiIsImRheTMiLCJkYXk0IiwiZGF5NSIpLHhsYWI9IiIseWxhYj0iZmlyZSBzaXplIChrbTIpIix5bGltPWMoMCwzMDApLCBjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKCnQudGVzdChsb2cocHJvMSRncm93dGhfa20pLGxvZyhwcm8xaCRncm93dGhfa20pKQp0LnRlc3QobG9nKHBybzIkZ3Jvd3RoX2ttKSxsb2cocHJvMmgkZ3Jvd3RoX2ttKSkKdC50ZXN0KGxvZyhwcm8zJGdyb3d0aF9rbSksbG9nKHBybzNoJGdyb3d0aF9rbSkpCnQudGVzdChsb2cocHJvNCRncm93dGhfa20pLGxvZyhwcm80aCRncm93dGhfa20pKQp0LnRlc3QobG9nKHBybzUkZ3Jvd3RoX2ttKSxsb2cocHJvNWgkZ3Jvd3RoX2ttKSkKCm1lWzFdID1tZWFuKHBybzEkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbMl0gPW1lYW4ocHJvMiRncm93dGhfa20sbmEub21pdD1UKQptZVszXSA9bWVhbihwcm8zJGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lWzRdID1tZWFuKHBybzQkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbNV0gPW1lYW4ocHJvNSRncm93dGhfa20sbmEub21pdD1UKQoKbWUxWzFdID1tZWFuKHBybzFoJGdyb3d0aF9rbSxuYS5ybT1UKQptZTFbMl0gPW1lYW4ocHJvMmgkZ3Jvd3RoX2ttLG5hLnJtPVQpCm1lMVszXSA9bWVhbihwcm8zaCRncm93dGhfa20sbmEucm09VCkKbWUxWzRdID1tZWFuKHBybzRoJGdyb3d0aF9rbSxuYS5ybT1UKQptZTFbNV0gPW1lYW4ocHJvNWgkZ3Jvd3RoX2ttLG5hLnJtPVQpCgpwYXIobWdwPWMoMi4zLDEsMCkpICAKcGxvdChtZSx0eXBlPSJvIiwgeWxpbT1jKDAsMTUwKSx5bGFiPWV4cHJlc3Npb24oImZpcmUgc2l6ZSAoa20iXjIqIikiKSx4bGFiPSIiLCB4YXh0PSduJywgbHR5ID0gMSwgbHdkID0gMixjZXgubGFiPTEuMikKYXhpcyhzaWRlPTEsIGF0PWMoMTo1KSxsYWJlbHM9ZGF5cykKcG9pbnRzKG1lMSx0eXBlPSJvIixsdHkgPSAyLCBsd2QgPSAyKQpgYGAKCgpgYGB7cn0KcHJvMSA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMSAmIHJlcyRodW1hbiA9PSAxICYgKCByZXMkbW9udGggPjggKSAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQpwcm8yID0gcmVzW3JlcyRmaXJlX2RheSA9PSAyICYgcmVzJGh1bWFuID09IDEgJiAoIHJlcyRtb250aCA+OCApICYgKHJlcyRlY28xID09IDYgfCByZXMkZWNvMSA9PSA3KSxdCnBybzMgPSByZXNbcmVzJGZpcmVfZGF5ID09IDMgJiByZXMkaHVtYW4gPT0gMSAmICggcmVzJG1vbnRoID44ICkgJiAocmVzJGVjbzEgPT0gNiB8IHJlcyRlY28xID09IDcpLF0KcHJvNCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gNCAmIHJlcyRodW1hbiA9PSAxICYgKCByZXMkbW9udGggPjggKSAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQpwcm81ID0gcmVzW3JlcyRmaXJlX2RheSA9PSA1ICYgcmVzJGh1bWFuID09IDEgJiAoIHJlcyRtb250aCA+OCApICYgKHJlcyRlY28xID09IDYgfCByZXMkZWNvMSA9PSA3KSxdCgpib3hwbG90KHBybzEkZ3Jvd3RoX2ttLHBybzIkZ3Jvd3RoX2ttLHBybzMkZ3Jvd3RoX2ttLHBybzQkZ3Jvd3RoX2ttLHBybzUkZ3Jvd3RoX2ttLG5hbWVzPWMoImRheTEiLCJkYXkyIiwiZGF5MyIsImRheTQiLCJkYXk1IikseGxhYj0iIix5bGFiPSJmaXJlIHNpemUgKGttMikiLHlsaW09YygwLDMwMCksIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQoKcHJvMWggPSByZXNbcmVzJGZpcmVfZGF5ID09IDEgJiByZXMkaHVtYW4gPT0gMiAmICggcmVzJG1vbnRoID44ICkgJiAocmVzJGVjbzEgPT0gNiB8IHJlcyRlY28xID09IDcpLF0KcHJvMmggPSByZXNbcmVzJGZpcmVfZGF5ID09IDIgJiByZXMkaHVtYW4gPT0gMiAmICggcmVzJG1vbnRoID44ICkgJiAocmVzJGVjbzEgPT0gNiB8IHJlcyRlY28xID09IDcpLF0KcHJvM2ggPSByZXNbcmVzJGZpcmVfZGF5ID09IDMgJiByZXMkaHVtYW4gPT0gMiAmICggcmVzJG1vbnRoID44ICkgJiAocmVzJGVjbzEgPT0gNiB8IHJlcyRlY28xID09IDcpLF0KcHJvNGggPSByZXNbcmVzJGZpcmVfZGF5ID09IDQgJiByZXMkaHVtYW4gPT0gMiAmIChyZXMkbW9udGggPjggKSAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQpwcm81aCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gNSAmIHJlcyRodW1hbiA9PSAyICYgKCByZXMkbW9udGggPjggKSAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQoKYm94cGxvdChwcm8xaCRncm93dGhfa20scHJvMmgkZ3Jvd3RoX2ttLHBybzNoJGdyb3d0aF9rbSxwcm80aCRncm93dGhfa20scHJvNWgkZ3Jvd3RoX2ttLG5hbWVzPWMoImRheTEiLCJkYXkyIiwiZGF5MyIsImRheTQiLCJkYXk1IikseGxhYj0iIix5bGFiPSJmaXJlIHNpemUgKGttMikiLHlsaW09YygwLDMwMCksIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQoKYGBgCgpgCgojIyMjIyMjIyMjIyMgaG93IG1hbnkgZGF5cyBkb2VzIGl0IHRha2UgdG8gcmVhY2ggNzUlIGJ1cm50IGFyZWEgIyMjIyMjIyMjIyMjIyMjIyMKCmBgYHtyfQpyZXM3NSA9IHJlc1tyZXMkcGVyX2JhID4gMC43NSxdCnBlYWtfZGF5ID0gYXMuZGF0YS5mcmFtZShhZ2dyZWdhdGUocmVzNzUkZmlyZV9kYXksIGJ5ID0gbGlzdChyZXM3NSRmaXJlbmFtZSxyZXM3NSRjYXVzZSksIG1pbikpCnBlYWtfZGF5PXN1YnNldChwZWFrX2RheSx4IDwgNTUpCmhpID0gaGlzdChwZWFrX2RheSR4LHByb2IgPUYsIGJyZWFrcz0gYygwOjUzKSwgeGxpbT1jKDAsNTUpLCB5bGFiPSJudW1iZXIgb2YgZmlyZXMiLCB4bGFiPSJkYXlzIiwgY2V4LmxhYj0xLjQsY2V4LmF4aXM9MS4zKQoKb3V0MSA9IHN1YnNldChyZXM3NSxjYXVzZSA9PSAxICkgICAjMT1saWdodG5pbmc7IDE0PXVua25vd247IDc9YXJzb24Kb3V0MiA9IHN1YnNldChyZXM3NSxjYXVzZSAhPTEgJiBjYXVzZSAhPSAxNCApCnBlYWtfZGF5MSA9IGFzLmRhdGEuZnJhbWUoYWdncmVnYXRlKG91dDEkZmlyZV9kYXksIGJ5ID0gbGlzdChvdXQxJGZpcmVuYW1lKSwgbWluKSkKcGVha19kYXkyID0gYXMuZGF0YS5mcmFtZShhZ2dyZWdhdGUob3V0MiRmaXJlX2RheSwgYnkgPSBsaXN0KG91dDIkZmlyZW5hbWUpLCBtaW4pKQoKcXVhbnRpbGUocGVha19kYXkxJHgsMC41MCx0eXBlPTMpIApxdWFudGlsZShwZWFrX2RheTIkeCwwLjUwLHR5cGU9MykgCgpwZWFrX2RheTE9c3Vic2V0KHBlYWtfZGF5MSx4IDwgNTYpCnBlYWtfZGF5Mj1zdWJzZXQocGVha19kYXkyLHggPCA1NikKaGlzdC5hID1oaXN0KHBlYWtfZGF5MSR4LGJyZWFrcyA9YygwOjU1KSxwbG90PUYpCmhpc3QuYiA9aGlzdChwZWFrX2RheTIkeCxicmVha3MgPWMoMDo1NSkscGxvdD1GKQpmZyA9IHJiaW5kKGhpc3QuYSRjb3VudHMsaGlzdC5iJGNvdW50cykKCmZyID0gYmFycGxvdChmZyx4bGFiPSJEYXlzIGFmdGVyIGlnbml0aW9uIix5bGFiPSJOdW1iZXIgb2YgZmlyZXMiLGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zLCB4bGltPWMoMSw2NSksIHlsaW09YygwLDMwKSkKYXhpcygxLGMoMC43LDUuNSwxMS41LDE3LjUsMjMuNSwyOS41LDM1LjUsNDEuNSw0Ny41LDUzLjUsNTkuNSw2NS41KSxsYWJlbHM9YygxLDUsMTAsMTUsMjAsMjUsMzAsMzUsNDAsNDUsNTAsNTUpLGNleC5heGlzID0gMS4zKQpsZWdlbmQoInRvcHJpZ2h0IixsZWdlbmQgPSBjKCJodW1hbiIsImxpZ2h0bmluZyIpLCBmaWxsPWMoImdyZXkiLCJibGFjayIpLGNleD0xLjQsYnR5ID0gIm4iKQoKdGlmZihmaWxlPSIvVXNlcnMvc3Rpam5oYW50c29uL0RvY3VtZW50cy9Eb2N1bWVudHMvYXJ0aWN1bG9zL2VuX3Byb2Nlc28vVklJUlNfcm9zL3RpbWVfdG9fcmVhY2g3NV92MS50aWYiLHdpZHRoPTI1MDAsaGVpZ2h0PTIwMDAsIHJlcz0zNTApCmZyID0gYmFycGxvdChmZyx4bGFiPSJEYXlzIGFmdGVyIGlnbml0aW9uIix5bGFiPSJOdW1iZXIgb2YgZmlyZXMiLGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zLCB4bGltPWMoMSw2NSksIHlsaW09YygwLDMwKSkKYXhpcygxLGMoMC43LDUuNSwxMS41LDE3LjUsMjMuNSwyOS41LDM1LjUsNDEuNSw0Ny41LDUzLjUsNTkuNSw2NS41KSxsYWJlbHM9YygxLDUsMTAsMTUsMjAsMjUsMzAsMzUsNDAsNDUsNTAsNTUpLGNleC5heGlzID0gMS4zKQpsZWdlbmQoInRvcHJpZ2h0IixsZWdlbmQgPSBjKCJodW1hbiIsImxpZ2h0bmluZyIpLCBmaWxsPWMoImdyZXkiLCJibGFjayIpLGNleD0xLjQsYnR5ID0gIm4iKQpkZXYub2ZmKCkKCmBgYAoKCmBgYHtyfQoKcmVzPXJlc1tyZXMkcm9zX2ttPjAsXQpyZXNfZiA9IHJlc1tyZXMkbWF4X2xhbmQgPT0gMSxdCnJlc19wID0gcmVzW3JlcyRtYXhfbGFuZCAhPSAxLF0KCiNqdXN0IHNob3cgdGhlIHBsb3QgaGVyZQpwbG90KHJlc19mJG1lYW5fZnJwfnJlc19mJHJvc19rbSxsb2c9Inh5Iix4bGltPWMoMC4wMDUsMzApLHlsaW09YygwLjEsMTgwKSx4YXh0PSJuIix5bGFiPSJtZWFuIEZSUCAoTVcpIix4bGFiPSJSYXRlLW9mLVNwcmVhZCAoa20vZGF5KSIsIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zLGNvbD0iZGFya2dyZWVuIikKCm1hcmtzPWMoMC4wMSwwLjEsMSwxMCkKdGlmZigiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvRG9jdW1lbnRzL2FydGljdWxvcy9lbl9wcm9jZXNvL1ZJSVJTX3Jvcy9maWdfRlJQX3Jvc192Mi50aWYiLCB3aWR0aCA9IDUsIGhlaWdodCA9IDUsIHVuaXRzID0gJ2luJywgcmVzID0gMzAwKQpwbG90KHJlc19mJG1lYW5fZnJwfnJlc19mJHJvc19rbSxsb2c9Inh5Iix4bGltPWMoMC4wMDUsMzApLHlsaW09YygwLjEsMTgwKSx4YXh0PSJuIix5bGFiPSJtZWFuIEZSUCAoTVcpIix4bGFiPSJSYXRlLW9mLVNwcmVhZCAoa20vZGF5KSIsIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zLGNvbD0iZGFya2dyZWVuIikKcG9pbnRzKHJlc19wJG1lYW5fZnJwfnJlc19wJHJvc19rbSxjb2w9Im9yYW5nZSIpCmF4aXMoMSxhdD1tYXJrcyxsYWJlbHM9bWFya3MsY2V4LmF4aXM9MS40ICkKbGVnZW5kKCB4PSJ0b3BsZWZ0IixsZWdlbmQ9YygiRm9yZXN0IiwiR3Jhc3MgJiBzaHJ1YiIpLGNvbD1jKCJkYXJrZ3JlZW4iLCJvcmFuZ2UiKSxjZXg9MS4yLHBjaD0xLGJ0eSA9ICJuIikKZGV2Lm9mZigpCgoKCmBgYAoKCiMjIyMjIyMjICBkaWZmZXJlbmNlIGluIGZpcmUgc2l6ZSBmb3IgZmlyc3QgNSBkYXlzIGFjcm9zcyBjYWxpZm9ybmlhIGFuZCBib3RoIGVjb3N5c3RlbXMgCgpgYGB7cn0KIApyZXMkcm9zMSA9IHJlcyRtYXhfcm9zKzEKCgpvdXQxID0gc3Vic2V0KHJlcyxjYXVzZSA9PSAxICkgICAjMT1saWdodG5pbmc7IDE0PXVua25vd247IDc9YXJzb24Kb3V0MiA9IHN1YnNldChyZXMsY2F1c2UgIT0xICYgY2F1c2UgIT0gMTQgKQoKaHVtMSA9IG91dDJbb3V0MiRmaXJlX2RheSA9PTEsXQpodW0yID0gb3V0MltvdXQyJGZpcmVfZGF5ID09MixdCmh1bTMgPSBvdXQyW291dDIkZmlyZV9kYXkgPT0zLF0KaHVtNCA9IG91dDJbb3V0MiRmaXJlX2RheSA9PTQsXQpodW01ID0gb3V0MltvdXQyJGZpcmVfZGF5ID09NSxdCmxpZzEgPSBvdXQxW291dDEkZmlyZV9kYXkgPT0xLF0KbGlnMiA9IG91dDFbb3V0MSRmaXJlX2RheSA9PTIsXQpsaWczID0gb3V0MVtvdXQxJGZpcmVfZGF5ID09MyxdCmxpZzQgPSBvdXQxW291dDEkZmlyZV9kYXkgPT00LF0KbGlnNSA9IG91dDFbb3V0MSRmaXJlX2RheSA9PTUsXQptZWFuKGh1bTEkZ3Jvd3RoKQptZWFuKGh1bTIkZ3Jvd3RoKQptZWFuKGh1bTMkZ3Jvd3RoKQptZWFuKGh1bTQkZ3Jvd3RoKQptZWFuKGh1bTUkZ3Jvd3RoKQptZWFuKGxpZzEkZ3Jvd3RoKQptZWFuKGxpZzIkZ3Jvd3RoKQptZWFuKGxpZzMkZ3Jvd3RoKQptZWFuKGxpZzQkZ3Jvd3RoKQptZWFuKGxpZzUkZ3Jvd3RoKQp0LnRlc3QobG9nMTAoaHVtMSRncm93dGgpLGxvZzEwKGxpZzEkZ3Jvd3RoKSkKdC50ZXN0KGxvZzEwKGh1bTIkZ3Jvd3RoKSxsb2cxMChsaWcyJGdyb3d0aCkpCnQudGVzdChsb2cxMChodW0zJGdyb3d0aCksbG9nMTAobGlnMyRncm93dGgpKQp0LnRlc3QobG9nMTAoaHVtNCRncm93dGgpLGxvZzEwKGxpZzQkZ3Jvd3RoKSkKdC50ZXN0KGxvZzEwKGh1bTUkZ3Jvd3RoKSxsb2cxMChsaWc1JGdyb3d0aCkpCgpodW0xID0gb3V0MltvdXQyJGZpcmVfZGF5ID09MSAmIG91dDIkZWNvMT09NixdCmh1bTIgPSBvdXQyW291dDIkZmlyZV9kYXkgPT0yICYgb3V0MiRlY28xPT02LF0KaHVtMyA9IG91dDJbb3V0MiRmaXJlX2RheSA9PTMgJiBvdXQyJGVjbzE9PTYsXQpodW00ID0gb3V0MltvdXQyJGZpcmVfZGF5ID09NCAmIG91dDIkZWNvMT09NixdCmh1bTUgPSBvdXQyW291dDIkZmlyZV9kYXkgPT01ICYgb3V0MiRlY28xPT02LF0KbGlnMSA9IG91dDFbb3V0MSRmaXJlX2RheSA9PTEgJiBvdXQxJGVjbzE9PTYsXQpsaWcyID0gb3V0MVtvdXQxJGZpcmVfZGF5ID09MiAmIG91dDEkZWNvMT09NixdCmxpZzMgPSBvdXQxW291dDEkZmlyZV9kYXkgPT0zICYgb3V0MSRlY28xPT02LF0KbGlnNCA9IG91dDFbb3V0MSRmaXJlX2RheSA9PTQgJiBvdXQxJGVjbzE9PTYsXQpsaWc1ID0gb3V0MVtvdXQxJGZpcmVfZGF5ID09NSAmIG91dDEkZWNvMT09NixdCm1lYW4oaHVtMSRncm93dGgpCm1lYW4oaHVtMiRncm93dGgpCm1lYW4oaHVtMyRncm93dGgpCm1lYW4oaHVtNCRncm93dGgpCm1lYW4oaHVtNSRncm93dGgpCm1lYW4obGlnMSRncm93dGgsIG5hLnJtPVQpCm1lYW4obGlnMiRncm93dGgsIG5hLnJtPVQpCm1lYW4obGlnMyRncm93dGgsIG5hLnJtPVQpCm1lYW4obGlnNCRncm93dGgsIG5hLnJtPVQpCm1lYW4obGlnNSRncm93dGgsIG5hLnJtPVQpCnQudGVzdChsb2cxMChodW0xJGdyb3d0aCksbG9nMTAobGlnMSRncm93dGgpKQp0LnRlc3QobG9nMTAoaHVtMiRncm93dGgpLGxvZzEwKGxpZzIkZ3Jvd3RoKSkKdC50ZXN0KGxvZzEwKGh1bTMkZ3Jvd3RoKSxsb2cxMChsaWczJGdyb3d0aCkpCnQudGVzdChsb2cxMChodW00JGdyb3d0aCksbG9nMTAobGlnNCRncm93dGgpKQp0LnRlc3QobG9nMTAoaHVtNSRncm93dGgpLGxvZzEwKGxpZzUkZ3Jvd3RoKSkKCmh1bTEgPSBvdXQyW291dDIkZmlyZV9kYXkgPT0xICYgb3V0MiRlY28xPT0xMSxdCmh1bTIgPSBvdXQyW291dDIkZmlyZV9kYXkgPT0yICYgb3V0MiRlY28xPT0xMSxdCmh1bTMgPSBvdXQyW291dDIkZmlyZV9kYXkgPT0zICYgb3V0MiRlY28xPT0xMSxdCmh1bTQgPSBvdXQyW291dDIkZmlyZV9kYXkgPT00ICYgb3V0MiRlY28xPT0xMSxdCmh1bTUgPSBvdXQyW291dDIkZmlyZV9kYXkgPT01ICYgb3V0MiRlY28xPT0xMSxdCmxpZzEgPSBvdXQxW291dDEkZmlyZV9kYXkgPT0xICYgb3V0MSRlY28xPT0xMSxdCmxpZzIgPSBvdXQxW291dDEkZmlyZV9kYXkgPT0yICYgb3V0MSRlY28xPT0xMSxdCmxpZzMgPSBvdXQxW291dDEkZmlyZV9kYXkgPT0zICYgb3V0MSRlY28xPT0xMSxdCmxpZzQgPSBvdXQxW291dDEkZmlyZV9kYXkgPT00ICYgb3V0MSRlY28xPT0xMSxdCmxpZzUgPSBvdXQxW291dDEkZmlyZV9kYXkgPT01ICYgb3V0MSRlY28xPT0xMSxdCm1lYW4oaHVtMSRncm93dGgpCm1lYW4oaHVtMiRncm93dGgpCm1lYW4oaHVtMyRncm93dGgpCm1lYW4oaHVtNCRncm93dGgpCm1lYW4oaHVtNSRncm93dGgpCm1lYW4obGlnMSRncm93dGgsIG5hLnJtPVQpCm1lYW4obGlnMiRncm93dGgsIG5hLnJtPVQpCm1lYW4obGlnMyRncm93dGgsIG5hLnJtPVQpCm1lYW4obGlnNCRncm93dGgsIG5hLnJtPVQpCm1lYW4obGlnNSRncm93dGgsIG5hLnJtPVQpCiN0LnRlc3QobG9nMTAoaHVtMSRncm93dGgpLGxvZzEwKGxpZzEkZ3Jvd3RoKSkKI3QudGVzdChsb2cxMChodW0yJGdyb3d0aCksbG9nMTAobGlnMiRncm93dGgpKQp0LnRlc3QobG9nMTAoaHVtMyRncm93dGgpLGxvZzEwKGxpZzMkZ3Jvd3RoKSkKdC50ZXN0KGxvZzEwKGh1bTQkZ3Jvd3RoKSxsb2cxMChsaWc0JGdyb3d0aCkpCnQudGVzdChsb2cxMChodW01JGdyb3d0aCksbG9nMTAobGlnNSRncm93dGgpKQoKCmBgYAoKYGBge3J9CgpvdXQxID0gc3Vic2V0KHJlcyxjYXVzZSA9PSAxICkgICAjMT1saWdodG5pbmc7IDE0PXVua25vd247IDc9YXJzb24Kb3V0MiA9IHN1YnNldChyZXMsY2F1c2UgIT0xICYgY2F1c2UgIT0gMTQgKQoKbWVhbihvdXQxJHJvc19rbSxuYS5ybT1UKQptZWFuKG91dDIkcm9zX2ttLG5hLnJtPVQpCgpoaXN0LmEgPWhpc3Qob3V0MSRyb3Nfa20sYnJlYWtzID1jKDAsMC4wMSwwLjA1LDAuMSwwLjI1LDAuNSwxLDIsNSwxMCwyMCwzMCkscGxvdD1GKQpoaXN0LmIgPWhpc3Qob3V0MiRyb3Nfa20sYnJlYWtzID1jKDAsMC4wMSwwLjA1LDAuMSwwLjI1LDAuNSwxLDIsNSwxMCwyMCwzMCkscGxvdD1GKQpmZyA9IHJiaW5kKGhpc3QuYSRjb3VudHMsaGlzdC5iJGNvdW50cykKCmZyID0gYmFycGxvdChmZywgYmVzaWRlPVRSVUUseGxhYj0iUmF0ZS1vZi1TcHJlYWQgKGttL2RheSkiLHlsYWI9Ik51bWJlciBvZiBmaXJlIGRheXMiLGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQpheGlzKDEsYXQ9YygwLjUsMy41LDYuNSw5LjUsMTIuNSwxNS41LDE4LjUsMjEuNSwyNC41LDI3LjUsMzAuNSwzMy41KSxsYWJlbHM9aGlzdC5hJGJyZWFrcyxjZXguYXhpcyA9IDEuMykKbGVnZW5kKCJ0b3ByaWdodCIsbGVnZW5kID0gYygiaHVtYW4iLCJsaWdodG5pbmciKSwgZmlsbD1jKCJncmV5IiwiYmxhY2siKSxjZXg9MS40LGJ0eSA9ICJuIikKCm91dDEgPSBzdWJzZXQocmVzLGNhdXNlID09IDEgJiAoZWNvMSA9PSA2IHwgZWNvMSA9PSA3KSkgICAjMT1saWdodG5pbmc7IDE0PXVua25vd247IDc9YXJzb24Kb3V0MiA9IHN1YnNldChyZXMsY2F1c2UgIT0xICYgY2F1c2UgIT0gMTQgJiAoZWNvMSA9PSA2IHwgZWNvMSA9PSA3KSkKCmhpc3QuYSA9aGlzdChvdXQxJHJvc19rbSxicmVha3MgPWMoMCwwLjAxLDAuMDUsMC4xLDAuMjUsMC41LDEsMiw1LDEwLDIwLDMwKSxwbG90PUYpCmhpc3QuYiA9aGlzdChvdXQyJHJvc19rbSxicmVha3MgPWMoMCwwLjAxLDAuMDUsMC4xLDAuMjUsMC41LDEsMiw1LDEwLDIwLDMwKSxwbG90PUYpCmZnID0gcmJpbmQoaGlzdC5hJGNvdW50cyxoaXN0LmIkY291bnRzKQoKZnIgPSBiYXJwbG90KGZnLCBiZXNpZGU9VFJVRSx4bGFiPSJSYXRlLW9mLVNwcmVhZCAoa20vZGF5KSIseWxhYj0iTnVtYmVyIG9mIGZpcmUgZGF5cyIsY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCmF4aXMoMSxhdD1jKDAuNSwzLjUsNi41LDkuNSwxMi41LDE1LjUsMTguNSwyMS41LDI0LjUsMjcuNSwzMC41LDMzLjUpLGxhYmVscz1oaXN0LmEkYnJlYWtzLGNleC5heGlzID0gMS4zKQpsZWdlbmQoInRvcHJpZ2h0IixsZWdlbmQgPSBjKCJodW1hbiIsImxpZ2h0bmluZyIpLCBmaWxsPWMoImdyZXkiLCJibGFjayIpLGNleD0xLjQsYnR5ID0gIm4iKQoKb3V0MSA9IHN1YnNldChyZXMsY2F1c2UgPT0gMSAmIGVjbzEgPT0gMTEpICAgIzE9bGlnaHRuaW5nOyAxND11bmtub3duOyA3PWFyc29uCm91dDIgPSBzdWJzZXQocmVzLGNhdXNlICE9MSAmIGNhdXNlICE9IDE0ICYgZWNvMSA9PSAxMSkKCmhpc3QuYSA9aGlzdChvdXQxJHJvc19rbSxicmVha3MgPWMoMCwwLjAxLDAuMDUsMC4xLDAuMjUsMC41LDEsMiw1LDEwLDIwLDMwKSxwbG90PUYpCmhpc3QuYiA9aGlzdChvdXQyJHJvc19rbSxicmVha3MgPWMoMCwwLjAxLDAuMDUsMC4xLDAuMjUsMC41LDEsMiw1LDEwLDIwLDMwKSxwbG90PUYpCmZnID0gcmJpbmQoaGlzdC5hJGNvdW50cyxoaXN0LmIkY291bnRzKQoKZnIgPSBiYXJwbG90KGZnLCBiZXNpZGU9VFJVRSx4bGFiPSJSYXRlLW9mLVNwcmVhZCAoa20vZGF5KSIseWxhYj0iTnVtYmVyIG9mIGZpcmUgZGF5cyIsY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCmF4aXMoMSxhdD1jKDAuNSwzLjUsNi41LDkuNSwxMi41LDE1LjUsMTguNSwyMS41LDI0LjUsMjcuNSwzMC41LDMzLjUpLGxhYmVscz1oaXN0LmEkYnJlYWtzLGNleC5heGlzID0gMS4zKQpsZWdlbmQoInRvcHJpZ2h0IixsZWdlbmQgPSBjKCJodW1hbiIsImxpZ2h0bmluZyIpLCBmaWxsPWMoImdyZXkiLCJibGFjayIpLGNleD0xLjQsYnR5ID0gIm4iKQoKCm91dDEgPSBzdWJzZXQocmVzLGNhdXNlID09IDEgJiAoZWNvMSA9PSA2IHwgZWNvMSA9PSA3KSAmIChtb250aCA+IDkpKSAgICMxPWxpZ2h0bmluZzsgMTQ9dW5rbm93bjsgNz1hcnNvbgpvdXQyID0gc3Vic2V0KHJlcyxjYXVzZSAhPTEgJiBjYXVzZSAhPSAxNCAmIChlY28xID09IDYgfCBlY28xID09IDcpICYgKG1vbnRoID4gOSkpCgpoaXN0LmEgPWhpc3Qob3V0MSRyb3Nfa20sYnJlYWtzID1jKDAsMC4wMSwwLjA1LDAuMSwwLjI1LDAuNSwxLDIsNSwxMCwyMCwzMCkscGxvdD1GKQpoaXN0LmIgPWhpc3Qob3V0MiRyb3Nfa20sYnJlYWtzID1jKDAsMC4wMSwwLjA1LDAuMSwwLjI1LDAuNSwxLDIsNSwxMCwyMCwzMCkscGxvdD1GKQpmZyA9IHJiaW5kKGhpc3QuYSRjb3VudHMsaGlzdC5iJGNvdW50cykKCmZyID0gYmFycGxvdChmZywgYmVzaWRlPVRSVUUseGxhYj0iUmF0ZS1vZi1TcHJlYWQgKGttL2RheSkiLHlsYWI9Ik51bWJlciBvZiBmaXJlIGRheXMiLGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQpheGlzKDEsYXQ9YygwLjUsMy41LDYuNSw5LjUsMTIuNSwxNS41LDE4LjUsMjEuNSwyNC41LDI3LjUsMzAuNSwzMy41KSxsYWJlbHM9aGlzdC5hJGJyZWFrcyxjZXguYXhpcyA9IDEuMykKbGVnZW5kKCJ0b3ByaWdodCIsbGVnZW5kID0gYygiaHVtYW4iLCJsaWdodG5pbmciKSwgZmlsbD1jKCJncmV5IiwiYmxhY2siKSxjZXg9MS40LGJ0eSA9ICJuIikKCm91dDEgPSBzdWJzZXQocmVzLGNhdXNlID09IDEgJiBlY28xID09IDExICYgKG1vbnRoID4gOSkpICAgIzE9bGlnaHRuaW5nOyAxND11bmtub3duOyA3PWFyc29uCm91dDIgPSBzdWJzZXQocmVzLGNhdXNlICE9MSAmIGNhdXNlICE9IDE0ICYgZWNvMSA9PSAxMSAmIChtb250aCA+IDkpKQoKaGlzdC5hID1oaXN0KG91dDEkcm9zX2ttLGJyZWFrcyA9YygwLDAuMDEsMC4wNSwwLjEsMC4yNSwwLjUsMSwyLDUsMTAsMjAsMzApLHBsb3Q9RikKaGlzdC5iID1oaXN0KG91dDIkcm9zX2ttLGJyZWFrcyA9YygwLDAuMDEsMC4wNSwwLjEsMC4yNSwwLjUsMSwyLDUsMTAsMjAsMzApLHBsb3Q9RikKZmcgPSByYmluZChoaXN0LmEkY291bnRzLGhpc3QuYiRjb3VudHMpCgpmciA9IGJhcnBsb3QoZmcsIGJlc2lkZT1UUlVFLHhsYWI9IlJhdGUtb2YtU3ByZWFkIChrbS9kYXkpIix5bGFiPSJOdW1iZXIgb2YgZmlyZSBkYXlzIixjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKYXhpcygxLGF0PWMoMC41LDMuNSw2LjUsOS41LDEyLjUsMTUuNSwxOC41LDIxLjUsMjQuNSwyNy41LDMwLjUsMzMuNSksbGFiZWxzPWhpc3QuYSRicmVha3MsY2V4LmF4aXMgPSAxLjMpCmxlZ2VuZCgidG9wcmlnaHQiLGxlZ2VuZCA9IGMoImh1bWFuIiwibGlnaHRuaW5nIiksIGZpbGw9YygiZ3JleSIsImJsYWNrIiksY2V4PTEuNCxidHkgPSAibiIpCgoKb3V0MSA9IHN1YnNldChyZXMsY2F1c2UgPT0gMSAmIChlY28xID09IDYgfCBlY28xID09IDcpICYgKG1vbnRoID4gNSAmIG1vbnRoPDEwKSkgICAjMT1saWdodG5pbmc7IDE0PXVua25vd247IDc9YXJzb24Kb3V0MiA9IHN1YnNldChyZXMsY2F1c2UgIT0xICYgY2F1c2UgIT0gMTQgJiAoZWNvMSA9PSA2IHwgZWNvMSA9PSA3KSAmIChtb250aCA+IDUgJiBtb250aDwxMCkpCgpoaXN0LmEgPWhpc3Qob3V0MSRyb3Nfa20sYnJlYWtzID1jKDAsMC4wMSwwLjA1LDAuMSwwLjI1LDAuNSwxLDIsNSwxMCwyMCwzMCkscGxvdD1GKQpoaXN0LmIgPWhpc3Qob3V0MiRyb3Nfa20sYnJlYWtzID1jKDAsMC4wMSwwLjA1LDAuMSwwLjI1LDAuNSwxLDIsNSwxMCwyMCwzMCkscGxvdD1GKQpmZyA9IHJiaW5kKGhpc3QuYSRjb3VudHMsaGlzdC5iJGNvdW50cykKCmZyID0gYmFycGxvdChmZywgYmVzaWRlPVRSVUUseGxhYj0iUmF0ZS1vZi1TcHJlYWQgKGttL2RheSkiLHlsYWI9Ik51bWJlciBvZiBmaXJlIGRheXMiLGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQpheGlzKDEsYXQ9YygwLjUsMy41LDYuNSw5LjUsMTIuNSwxNS41LDE4LjUsMjEuNSwyNC41LDI3LjUsMzAuNSwzMy41KSxsYWJlbHM9aGlzdC5hJGJyZWFrcyxjZXguYXhpcyA9IDEuMykKbGVnZW5kKCJ0b3ByaWdodCIsbGVnZW5kID0gYygiaHVtYW4iLCJsaWdodG5pbmciKSwgZmlsbD1jKCJncmV5IiwiYmxhY2siKSxjZXg9MS40LGJ0eSA9ICJuIikKCm91dDEgPSBzdWJzZXQocmVzLGNhdXNlID09IDEgJiBlY28xID09IDExICAmIChtb250aCA+IDUgJiBtb250aDwxMCkpICAgIzE9bGlnaHRuaW5nOyAxND11bmtub3duOyA3PWFyc29uCm91dDIgPSBzdWJzZXQocmVzLGNhdXNlICE9MSAmIGNhdXNlICE9IDE0ICYgZWNvMSA9PSAxMSAgJiAobW9udGggPiA1ICYgbW9udGg8MTApKQoKaGlzdC5hID1oaXN0KG91dDEkcm9zX2ttLGJyZWFrcyA9YygwLDAuMDEsMC4wNSwwLjEsMC4yNSwwLjUsMSwyLDUsMTAsMjAsMzApLHBsb3Q9RikKaGlzdC5iID1oaXN0KG91dDIkcm9zX2ttLGJyZWFrcyA9YygwLDAuMDEsMC4wNSwwLjEsMC4yNSwwLjUsMSwyLDUsMTAsMjAsMzApLHBsb3Q9RikKZmcgPSByYmluZChoaXN0LmEkY291bnRzLGhpc3QuYiRjb3VudHMpCgpmciA9IGJhcnBsb3QoZmcsIGJlc2lkZT1UUlVFLHhsYWI9IlJhdGUtb2YtU3ByZWFkIChrbS9kYXkpIix5bGFiPSJOdW1iZXIgb2YgZmlyZSBkYXlzIixjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKYXhpcygxLGF0PWMoMC41LDMuNSw2LjUsOS41LDEyLjUsMTUuNSwxOC41LDIxLjUsMjQuNSwyNy41LDMwLjUsMzMuNSksbGFiZWxzPWhpc3QuYSRicmVha3MsY2V4LmF4aXMgPSAxLjMpCmxlZ2VuZCgidG9wcmlnaHQiLGxlZ2VuZCA9IGMoImh1bWFuIiwibGlnaHRuaW5nIiksIGZpbGw9YygiZ3JleSIsImJsYWNrIiksY2V4PTEuNCxidHkgPSAibiIpCgpgYGAKCgojIyMjIyMjIyMjIyMgYXJlIFJPUyB0aGUgc2FtZSBmb3IgbGlnaHQgJiBodW1hbiB1bmRlciB0aGUgc2FtZSBjb25kaXRpb25zCgpgYGB7cn0Kb3V0MSA9IHN1YnNldChyZXMsY2F1c2UgPT0gMSApICAgIzE9bGlnaHRuaW5nOyAxND11bmtub3duOyA3PWFyc29uCm91dDIgPSBzdWJzZXQocmVzLGNhdXNlICE9MSAmIGNhdXNlICE9IDE0ICkKCnBsb3Qob3V0MSR2cGQsbG9nKG91dDEkcm9zX2ttKSkKcG9pbnRzKG91dDIkdnBkLGxvZyhvdXQyJHJvc19rbSksY29sPSJyZWQiKQoKc3VtbWFyeShsbShvdXQxJHZwZH5sb2cob3V0MSRyb3Nfa20rMSksbmEub21pdD1UKSkKc3VtbWFyeShsbShvdXQyJHZwZH5sb2cob3V0MiRyb3Nfa20rMSkpKQoKYGBgCgoKCgojIyMjIyMjIyMjIyMjIyBhbmFseXNpcyBvZiB0aGUgZmlyc3QgZGF5ICMjIyMjIyMjIyMjIyMjIyMjCgpsb2FkIGRhdGEKYGBge3J9CgpkYWlseV9yZXM9cmVhZC50YWJsZSgiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvcHJvamVjdHMvVklJUlNfcm9zL2FsbF9pZ25pdGlvbnNfVjMudHh0IixoZWFkZXI9VCkKCnJlcz1hcy5kYXRhLmZyYW1lKGRhaWx5X3JlcykKCnJlcyRiaSA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJGJpKSkKcmVzJGVyYyA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJGVyYykpCnJlcyRldHIgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyRldHIpKQpyZXMkZm0xMDAgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyRmbTEwMCkpCnJlcyRmbTEwMDAgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyRmbTEwMDApKQpyZXMkcGV0ID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkcGV0KSkKcmVzJHByID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkcHIpKQpyZXMkcm1heCA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJHJtYXgpKQpyZXMkcm1pbiA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJHJtaW4pKQpyZXMkdGggPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyR0aCkpCnJlcyR0bW1uID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkdG1tbikpCnJlcyR0bW14ID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkdG1teCkpCnJlcyR2cGQgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyR2cGQpKQpyZXMkd3MgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyR3cykpCnJlcyR2cyA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJHZzKSkKcmVzJHRvdGFsX2FyZWEgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyR0b3RhbF9hcmVhKSkKcmVzJG1heF9sYW5kID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkbWF4X2xhbmQpKQpyZXMkbWVhbl9sYW5kID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkbWVhbl9sYW5kKSkKCnJlcyRiaW9tYXNzID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkYmlvbWFzcykpCgpyZXMgPSByZXNbLTEsXQpyZXMkaHVtYW5bcmVzJGNhdXNlID09MV0gPTEKcmVzJGh1bWFuW3JlcyRjYXVzZSAhPTEgJiByZXMkY2F1c2UgIT0xNF0gPTAKCmBgYAoKYW5hbHlzaXMKCmBgYHtyfQoKb3V0MSA9IHJlc1tyZXMkY2F1c2UgIT0xICYgcmVzJGNhdXNlICE9IDE0LF0gCm91dDIgPSByZXNbcmVzJGNhdXNlID09MSxdIAoKb3V0MSA9IHN1YnNldChyZXMsKGVjbzEgPT0gNiB8ZWNvMSA9PSA3KSAmIHJlcyRjYXVzZSAhPTEgJiByZXMkY2F1c2UgIT0gMTQpICAgIzE9bGlnaHRuaW5nOyAxND11bmtub3duOyA3PWFyc29uCm91dDIgPSBzdWJzZXQocmVzLChlY28xID09IDYgfGVjbzEgPT0gNykgJiByZXMkY2F1c2UgPT0xKSAgICMxPWxpZ2h0bmluZzsgMTQ9dW5rbm93bjsgNz1hcnNvbgoKb3V0MSA9IHN1YnNldChyZXMsZWNvMSA9PSAxMSYgcmVzJGNhdXNlICE9MSAmIHJlcyRjYXVzZSAhPSAxNCkKb3V0MiA9IHN1YnNldChyZXMsZWNvMSA9PSAxMSAmIHJlcyRjYXVzZSA9PTEpCgpvdXQxID0gc3Vic2V0KHJlcywoZWNvMSA9PSA2IHxlY28xID09IDcpICYgcmVzJGNhdXNlICE9MSAmIHJlcyRjYXVzZSAhPSAxNCAmIHJlcyRtb250ID4gNSAmIHJlcyRtb250IDwgMTAgKSAgICMxPWxpZ2h0bmluZzsgMTQ9dW5rbm93bjsgNz1hcnNvbgpvdXQyID0gc3Vic2V0KHJlcywoZWNvMSA9PSA2IHxlY28xID09IDcpICYgcmVzJGNhdXNlID09MSYgcmVzJG1vbnQgPiA1ICYgcmVzJG1vbnQgPCAxMCkgICAjMT1saWdodG5pbmc7IDE0PXVua25vd247IDc9YXJzb24KCnQudGVzdChvdXQxJGJpLG91dDIkYmkpCnQudGVzdChvdXQxJGVyYyxvdXQyJGVyYykKdC50ZXN0KG91dDEkZXRyLG91dDIkZXRyKQp0LnRlc3Qob3V0MSRmbTEwMCxvdXQyJGZtMTAwKQp0LnRlc3Qob3V0MSRmbTEwMDAsb3V0MiRmbTEwMDApCnQudGVzdChvdXQxJHBldCxvdXQyJHBldCkKdC50ZXN0KG91dDEkcHIsb3V0MiRwcikKdC50ZXN0KG91dDEkcm1heCxvdXQyJHJtYXgpCnQudGVzdChvdXQxJHJtaW4sb3V0MiRybWluKQp0LnRlc3Qob3V0MSR0aCxvdXQyJHRoKQp0LnRlc3Qob3V0MSR0bW1uLG91dDIkdG1tbikKdC50ZXN0KG91dDEkdG1teCxvdXQyJHRtbXgpCnQudGVzdChvdXQxJHZwZCxvdXQyJHZwZCkKdC50ZXN0KG91dDEkdnMsb3V0MiR2cykKdC50ZXN0KG91dDEkd3Msb3V0MiR3cykKdC50ZXN0KG91dDEkYmlvbWFzcyxvdXQyJGJpb21hc3MpCnQudGVzdChvdXQxJG1lYW5fbGFuZCxvdXQyJG1lYW5fbGFuZCkKdC50ZXN0KGxvZzEwKG91dDEkdG90YWxfYXJlYSksbG9nMTAob3V0MiR0b3RhbF9hcmVhKSkKCgoKYGBgCgpgYGB7cn0KCnRhID0gdGFibGUocmVzJGh1bWFuLHJlcyRtb250KQpwcyA9IGJhcnBsb3QodGEsIGJlc2lkZT1UUlVFLCB5bGFiPSJudW1iZXIgb2YgZmlyZXMiLHhwZD1ULHhsYWI9ICJtb250aCIsIHhheHQ9J24nLHlsaW09YygwLDMwMCksIGF4aXMubHR5PTEsY2V4LmxhYiA9IDEuNCxjZXguYXhpcyA9IDEuMiApCmF4aXMoMSxhdD1jKDIsNSw4LDExLDE0LDE3LDIwLDIzLDI2LDI5LDMyLDM1KSwgbGFiZWxzID1jKDE6MTIpLHhsaW09YygwLDM2KSx4cGQ9RiAsY2V4LmxhYiA9IDEuNCxjZXguYXhpcyA9IDEuMykKbGVnZW5kKCJ0b3ByaWdodCIsYygiaHVtYW4iLCJsaWdodG5pbmciKSxmaWxsID0gYygiZ3JleSIsICJibGFjayIpLCBidHk9Im4iLGNleD0xLjQpCnRleHQoMSwyODUsImEpIixjZXg9MS44KQpvdXQxID0gc3Vic2V0KHJlcyxlY28xID09IDYgfGVjbzEgPT0gNykgICAjMT1saWdodG5pbmc7IDE0PXVua25vd247IDc9YXJzb24Kb3V0MiA9IHN1YnNldChyZXMsZWNvMSA9PSAxMSkKCnRhID0gdGFibGUob3V0MSRodW1hbixvdXQxJG1vbnQpCnBzID0gYmFycGxvdCh0YSwgYmVzaWRlPVRSVUUsIHlsYWI9Im51bWJlciBvZiBmaXJlcyIseHBkPVQsIHhheHQ9J24nLHhsYWI9ICJtb250aCIsIHlsaW09YygwLDIwMCksIGF4aXMubHR5PTEsY2V4LmxhYiA9IDEuNCxjZXguYXhpcyA9IDEuMiApCmF4aXMoMSxhdD1jKDIsNSw4LDExLDE0LDE3LDIwLDIzLDI2LDI5LDMyLDM1KSwgbGFiZWxzID1jKDE6MTIpLHhsaW09YygwLDM2KSx4cGQ9RixjZXgubGFiID0gMS40LGNleC5heGlzID0gMS4zICkKbGVnZW5kKCJ0b3ByaWdodCIsYygiaHVtYW4iLCJsaWdodG5pbmciKSxmaWxsID0gYygiZ3JleSIsICJibGFjayIpLCBidHk9Im4iLGNleD0xLjQpCnRleHQoMSwxOTAsImIpIixjZXg9MS44KQoKdGEgPSB0YWJsZShvdXQyJGh1bWFuLG91dDIkbW9udCkKcHMgPSBiYXJwbG90KHRhLCBiZXNpZGU9VFJVRSwgeWxhYj0ibnVtYmVyIG9mIGZpcmVzIix4cGQ9VCx4YXh0PSduJyx4bGFiPSAibW9udGgiLCB5bGltPWMoMCwyMDApLCBheGlzLmx0eT0xLGNleC5sYWIgPSAxLjQsY2V4LmF4aXMgPSAxLjIgKQpheGlzKDEsYXQ9YygyLDUsOCwxMSwxNCwxNywyMCwyMywyNiwyOSwzMiwzNSksIGxhYmVscyA9YygxOjEyKSx4bGltPWMoMCwzNikseHBkPUYsY2V4LmxhYiA9IDEuNCxjZXguYXhpcyA9IDEuMyApCmxlZ2VuZCgidG9wcmlnaHQiLGMoImh1bWFuIiwibGlnaHRuaW5nIiksZmlsbCA9IGMoImdyZXkiLCAiYmxhY2siKSwgYnR5PSJuIixjZXg9MS40KQp0ZXh0KDEsMTkwLCJjKSIsY2V4PTEuOCkKYGBgCgoKCgpgYGB7cn0KZGF0YV9zPXJlYWQudGFibGUoIi9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL3Byb2plY3RzL1ZJSVJTX3Jvcy9kYWlseV9tZWFuX3Jvc19kTkJSX1Y2LnR4dCIscm93Lm5hbWVzPU5VTEwpCnJvd25hbWVzKGRhdGFfcykgPC0gYygpCgpkYXRhX3MxID0gYXMuZGF0YS5mcmFtZShkYXRhX3NbLDI6MTldKQoKCm5hbWVzKGRhdGFfczEpID0gYygibG9uIiwibGF0IiwiZmlyZSIsIm5yX2RheSIsIm1heF9sYW5kIiwibWVhbl9sYW5kIiwiZWxldmF0aW9uIiwiYmlvbWFzcyIsIm1lYW5fcm9zIiwicm9zOTUiLCJtZWFuX2RuYnIiLCJkbmJyOTUiLCJtZWFuX3JkbmJyIiwicmRuYnI5NSIsIm1lYW5fQkFfcmVkIiwiQkFfcmVkOTUiLCJjYXVzZSIsInNpemUiKQpsZW5ndGgoZGF0YV9zMSRsb24pCmRhdGFfczEkbWVhbl9yb3MgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRhdGFfczEkbWVhbl9yb3MpKQpkYXRhX3MxJHJvczk1ID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihkYXRhX3MxJHJvczk1KSkKZGF0YV9zMSRtZWFuX2RuYnIgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRhdGFfczEkbWVhbl9kbmJyKSkKZGF0YV9zMSRkbmJyOTUgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRhdGFfczEkZG5icjk1KSkKZGF0YV9zMSRtZWFuX3JkbmJyID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihkYXRhX3MxJG1lYW5fcmRuYnIpKQpkYXRhX3MxJHJkbmJyOTUgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRhdGFfczEkcmRuYnI5NSkpCmRhdGFfczEkbG9uID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihkYXRhX3MxJGxvbikpCmRhdGFfczEkbGF0ID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihkYXRhX3MxJGxhdCkpCgpkYXRhX3MxJG1lYW5fbGFuZFtpcy5uYShkYXRhX3MxJG1lYW5fbGFuZCldPWRhdGFfczEkbWF4X2xhbmRbaXMubmEoZGF0YV9zMSRtZWFuX2xhbmQpXSAjbWVhbiBsYW5kY292ZXIgZ2l2ZXMgTkEgd2hlbiBvbmx5IG9uZSBsYW5kY292ZXIgaXMgcHJlc2VudApkYXRhX3MxJG1lYW5fbGFuZCA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZGF0YV9zMSRtZWFuX2xhbmQpKQpkYXRhX3MxJG1lYW5fQkFfcmVkID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihkYXRhX3MxJG1lYW5fQkFfcmVkKSkKZGF0YV9zMSRCQV9yZWQ5NSA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZGF0YV9zMSRCQV9yZWQ5NSkpCmRhdGFfczEkYmlvbWFzcyA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZGF0YV9zMSRiaW9tYXNzKSkKZGF0YV9zMSRlbGV2YXRpb24gPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRhdGFfczEkZWxldmF0aW9uKSkKZGF0YV9zMSRjYXVzZSA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZGF0YV9zMSRjYXVzZSkpCgpkYXRhX3MxPW5hLm9taXQoZGF0YV9zMSkKc2hhcGUgPSBzaGFwZWZpbGUoIi9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL2RhdGEvdmVnX2NhbGlmb3JuaWEvY2FfZWNvX2wzL2NhX2Vjb19sMy5zaHAiKQpwdHMgPC0gU3BhdGlhbFBvaW50cyhkYXRhX3MxWyxjKCJsb24iLCJsYXQiKV0sUDRTLmxhdGxvbikKc2hhcGUgPSBzcFRyYW5zZm9ybShzaGFwZSxQNFMubGF0bG9uKQplY28gPSBvdmVyKHB0cywgc2hhcGUpCmRhdGFfczEkTDFDT0RFID0gZWNvJE5BX0wxQ09ERQpkYXRhX3MxJEwzbmFtZSA9IGVjbyRVU19MM05BTUUKZGF0YV9zMSRMMUNPREUgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRhdGFfczEkTDFDT0RFKSkKCiNkYXRhX3MxJGxvZ19yb3MgPSBsb2cxMChkYXRhX3MxJG1lYW5fcm9zKQojZGF0YV9zMSRsb2dfcm9zOTUgPSBsb2cxMChkYXRhX3MxJHJvczk1KQojZGF0YV9zMSA9IGRhdGFfczFbZGF0YV9zMSRtZWFuX3JvcyA+MCxdCmRhdGFfczEkaHVtYW5bZGF0YV9zMSRjYXVzZSAhPTEgJiBkYXRhX3MxJGNhdXNlICE9MTQgJiBkYXRhX3MxJGNhdXNlICE9MTddPTEKZGF0YV9zMSRodW1hbltkYXRhX3MxJGNhdXNlID09MSBdPTIKCmRhdGFfczEkcm9zX2ttID0gKGRhdGFfczEkcm9zOTUgKjI0KS8xMDAwCmRhdGFfdGVzdCA9IGRhdGFfczFbZGF0YV9zMSRtYXhfbGFuZCA9PSAxLF0KZGF0YV90ZXN0MSA9IGRhdGFfczFbZGF0YV9zMSRMMUNPREUgPT0gNiB8ZGF0YV9zMSRMMUNPREUgPT0gNyAsXQpkYXRhX3Rlc3QyID0gZGF0YV9zMVtkYXRhX3MxJEwxQ09ERSA9PSAxMSxdCgpkYXRhX3Rlc3QxID0gZGF0YV9zMVtkYXRhX3MxJGh1bWFuID09IDEgJiAoZGF0YV9zMSRMMUNPREUgPT0gNiB8ZGF0YV9zMSRMMUNPREUgPT0gNyksXQpkYXRhX3Rlc3QyID0gZGF0YV9zMVtkYXRhX3MxJGh1bWFuID09IDIgJiAoZGF0YV9zMSRMMUNPREUgPT0gNiB8ZGF0YV9zMSRMMUNPREUgPT0gNyksXQoKZGF0YV90ZXN0MSA9IGRhdGFfczFbZGF0YV9zMSRodW1hbiA9PSAxICxdCmRhdGFfdGVzdDIgPSBkYXRhX3MxW2RhdGFfczEkaHVtYW4gPT0gMiAsXQoKZGF0YV90ZXN0MT1uYS5vbWl0KGRhdGFfdGVzdDEpCmRhdGFfdGVzdDI9bmEub21pdChkYXRhX3Rlc3QyKQoKcGxvdChkYXRhX3MxJHJvc19rbSwgZGF0YV9zMSRtZWFuX0JBX3JlZCxsb2c9IngiLHhsYWI9IlJhdGUtb2YtU3ByZWFkIChrbS9kYXkpIix5bGFiPSJUcmVlIG1vcnRhbGl0eSAoJSkiLHhsaW09YygwLjAwNSwzMCkseGF4dD0ibiIsY2V4LmF4aXM9MS40ICxjZXgubGFiPTEuNCxjZXg9MC44LCBjb2w9ImJsYWNrIikKYXhpcygxLGF0PW1hcmtzLGxhYmVscz1tYXJrcyxjZXguYXhpcz0xLjQgKQpwb2ludHMoZGF0YV90ZXN0MiRyb3Nfa20sIGRhdGFfdGVzdDIkbWVhbl9CQV9yZWQsY2V4PTAuOCwgY29sPSJkYXJrZ3JleSIpCnBvaW50cyhkYXRhX3Rlc3QxJHJvc19rbSwgZGF0YV90ZXN0MSRtZWFuX0JBX3JlZCxjZXg9MC44LCBjb2w9Im9yYW5nZSIpCgoKbWFya3M9YygwLjAxLDAuMSwxLDEwKQp0aWZmKCIvVXNlcnMvc3Rpam5oYW50c29uL0RvY3VtZW50cy9Eb2N1bWVudHMvYXJ0aWN1bG9zL2VuX3Byb2Nlc28vVklJUlNfcm9zL2ZpZ19iYXNhX3Jvc19hbGxfdjMudGlmIiwgd2lkdGggPSA1LCBoZWlnaHQgPSA1LCB1bml0cyA9ICdpbicsIHJlcyA9IDMwMCkKcGxvdChkYXRhX3MxJHJvc19rbSwgZGF0YV9zMSRtZWFuX0JBX3JlZCxsb2c9IngiLHhsYWI9IlJhdGUtb2YtU3ByZWFkIChrbS9kYXkpIix5bGFiPSJUcmVlIG1vcnRhbGl0eSAoJSkiLHhsaW09YygwLjAwNSwzMCkseGF4dD0ibiIsY2V4LmF4aXM9MS40ICxjZXgubGFiPTEuNCxjZXg9MC44LCBjb2w9ImJsYWNrIikKYXhpcygxLGF0PW1hcmtzLGxhYmVscz1tYXJrcyxjZXguYXhpcz0xLjQgKQpwb2ludHMoZGF0YV90ZXN0MiRyb3Nfa20sIGRhdGFfdGVzdDIkbWVhbl9CQV9yZWQsY2V4PTAuOCwgY29sPSJkYXJrZ3JleSIpCnBvaW50cyhkYXRhX3Rlc3QxJHJvc19rbSwgZGF0YV90ZXN0MSRtZWFuX0JBX3JlZCxjZXg9MC44LCBjb2w9Im9yYW5nZSIpCmxpbmVzKGxvd2VzcyhkYXRhX3MxJHJvc19rbSwgZGF0YV9zMSRtZWFuX0JBX3JlZCwgZj0wLjQxKSxjb2w9ImJsYWNrIiwgbHdkPTMpCmxpbmVzKGxvd2VzcyhkYXRhX3Rlc3QxJHJvc19rbSwgZGF0YV90ZXN0MSRtZWFuX0JBX3JlZCwgZj0wLjQxKSxjb2w9ImRhcmtnb2xkZW5yb2QzIiwgbHdkPTMpCmxpbmVzKGxvd2VzcyhkYXRhX3Rlc3QyJHJvc19rbSwgZGF0YV90ZXN0MiRtZWFuX0JBX3JlZCwgZj0wLjQxKSxjb2w9ImdyYXk0MCIsIGx3ZD0zKQpsZWdlbmQoInRvcGxlZnQiLGxlZ2VuZD1jKCJhbGwiLCJodW1hbiIsImxpZ2h0bmluZyIpLGNvbCA9IGMoImJsYWNrIiwiZGFya2dvbGRlbnJvZDMiLCAiZ3JheTQwIiksbHR5PTEsIGJ0eT0ibiIsbHdkID0gMywgY2V4PTEpCmRldi5vZmYoKQoKCgpkYXRhX3Rlc3QxID0gZGF0YV9zMVtkYXRhX3MxJGh1bWFuID09IDEgJiBkYXRhX3MxJG1heF9sYW5kIDwxLjUsXQpkYXRhX3Rlc3QyID0gZGF0YV9zMVtkYXRhX3MxJGh1bWFuID09IDIgJiBkYXRhX3MxJG1heF9sYW5kIDwxLjUsXQpkYXRhX2ZvcmVzdCA9IGRhdGFfczFbZGF0YV9zMSRtYXhfbGFuZCA8MS41LF0KZGF0YV90ZXN0MT1uYS5vbWl0KGRhdGFfdGVzdDEpCmRhdGFfdGVzdDI9bmEub21pdChkYXRhX3Rlc3QyKQoKbWFya3M9YygwLjAxLDAuMSwxLDEwKQp0aWZmKCIvVXNlcnMvc3Rpam5oYW50c29uL0RvY3VtZW50cy9Eb2N1bWVudHMvYXJ0aWN1bG9zL2VuX3Byb2Nlc28vVklJUlNfcm9zL2ZpZ19iYXNhX3Jvc19mb3Jlc3RfdjMudGlmIiwgd2lkdGggPSA1LCBoZWlnaHQgPSA1LCB1bml0cyA9ICdpbicsIHJlcyA9IDMwMCkKcGxvdChkYXRhX2ZvcmVzdCRyb3Nfa20sIGRhdGFfZm9yZXN0JG1lYW5fQkFfcmVkLGxvZz0ieCIseGxhYj0iUmF0ZS1vZi1TcHJlYWQgKGttL2RheSkiLHlsYWI9IlRyZWUgbW9ydGFsaXR5ICglKSIseGxpbT1jKDAuMDA1LDMwKSx4YXh0PSJuIixjZXguYXhpcz0xLjQgLGNleC5sYWI9MS40LGNleD0wLjgsIGNvbD0iYmxhY2siKQpheGlzKDEsYXQ9bWFya3MsbGFiZWxzPW1hcmtzLGNleC5heGlzPTEuNCApCnBvaW50cyhkYXRhX3Rlc3QyJHJvc19rbSwgZGF0YV90ZXN0MiRtZWFuX0JBX3JlZCxjZXg9MC44LCBjb2w9ImRhcmtncmV5IikKcG9pbnRzKGRhdGFfdGVzdDEkcm9zX2ttLCBkYXRhX3Rlc3QxJG1lYW5fQkFfcmVkLGNleD0wLjgsIGNvbD0ib3JhbmdlIikKbGluZXMobG93ZXNzKGRhdGFfZm9yZXN0JHJvc19rbSwgZGF0YV9mb3Jlc3QkbWVhbl9CQV9yZWQsIGY9MC40MSksY29sPSJibGFjayIsIGx3ZD0zKQpsaW5lcyhsb3dlc3MoZGF0YV90ZXN0MSRyb3Nfa20sIGRhdGFfdGVzdDEkbWVhbl9CQV9yZWQsIGY9MC40MSksY29sPSJkYXJrZ29sZGVucm9kMyIsIGx3ZD0zKQpsaW5lcyhsb3dlc3MoZGF0YV90ZXN0MiRyb3Nfa20sIGRhdGFfdGVzdDIkbWVhbl9CQV9yZWQsIGY9MC40MSksY29sPSJncmF5NDAiLCBsd2Q9MykKbGVnZW5kKCJ0b3BsZWZ0IixsZWdlbmQ9YygiYWxsIiwiaHVtYW4iLCJsaWdodG5pbmciKSxjb2wgPSBjKCJibGFjayIsImRhcmtnb2xkZW5yb2QzIiwgImdyYXk0MCIpLGx0eT0xLCBidHk9Im4iLGx3ZCA9IDMsIGNleD0xKQpkZXYub2ZmKCkKCgpwbG90KGRhdGFfZm9yZXN0JHJvc19rbSwgZGF0YV9mb3Jlc3QkbWVhbl9CQV9yZWQsbG9nPSJ4Iix4bGFiPSJSYXRlLW9mLVNwcmVhZCAoa20vZGF5KSIseWxhYj0iVHJlZSBtb3J0YWxpdHkgKCUpIix4bGltPWMoMC4wMDUsMzApLHhheHQ9Im4iLGNleC5heGlzPTEuNCAsY2V4LmxhYj0xLjQsY2V4PTAuOCwgY29sPSJibGFjayIpCmF4aXMoMSxhdD1tYXJrcyxsYWJlbHM9bWFya3MsY2V4LmF4aXM9MS40ICkKcG9pbnRzKGRhdGFfdGVzdDIkcm9zX2ttLCBkYXRhX3Rlc3QyJG1lYW5fQkFfcmVkLGNleD0wLjgsIGNvbD0iZGFya2dyZXkiKQpwb2ludHMoZGF0YV90ZXN0MSRyb3Nfa20sIGRhdGFfdGVzdDEkbWVhbl9CQV9yZWQsY2V4PTAuOCwgY29sPSJvcmFuZ2UiKQpsaW5lcyhsb3dlc3MoZGF0YV9mb3Jlc3Qkcm9zX2ttLCBkYXRhX2ZvcmVzdCRtZWFuX0JBX3JlZCwgZj0wLjQ1KSxjb2w9ImJsYWNrIiwgbHdkPTMpCmxpbmVzKGxvd2VzcyhkYXRhX3Rlc3QxJHJvc19rbSwgZGF0YV90ZXN0MSRtZWFuX0JBX3JlZCwgZj0wLjQ1KSxjb2w9ImRhcmtnb2xkZW5yb2QzIiwgbHdkPTMpCmxpbmVzKGxvd2VzcyhkYXRhX3Rlc3QyJHJvc19rbSwgZGF0YV90ZXN0MiRtZWFuX0JBX3JlZCwgZj0wLjQ1KSxjb2w9ImdyYXk0MCIsIGx3ZD0zKQoKCmBgYAoKCmBgYHtyfQoKZGF0YV90ZXN0ID0gZGF0YV9zMVtkYXRhX3MxJG1heF9sYW5kID09IDEsXQpkYXRhX3Rlc3QxID0gZGF0YV9zMVtkYXRhX3MxJEwxQ09ERSA9PSA2IHxkYXRhX3MxJEwxQ09ERSA9PSA3ICxdCmRhdGFfdGVzdDIgPSBkYXRhX3MxW2RhdGFfczEkTDFDT0RFID09IDExLF0KCmRhdGFfdGVzdDEgPSBkYXRhX3MxW2RhdGFfczEkaHVtYW4gPT0gMSAmIChkYXRhX3MxJEwxQ09ERSA9PSA2IHxkYXRhX3MxJEwxQ09ERSA9PSA3KSxdCmRhdGFfdGVzdDIgPSBkYXRhX3MxW2RhdGFfczEkaHVtYW4gPT0gMiAmIChkYXRhX3MxJEwxQ09ERSA9PSA2IHxkYXRhX3MxJEwxQ09ERSA9PSA3KSxdCgpkYXRhX3Rlc3QxID0gZGF0YV9zMVtkYXRhX3MxJGh1bWFuID09IDEgLF0KZGF0YV90ZXN0MiA9IGRhdGFfczFbZGF0YV9zMSRodW1hbiA9PSAyICxdCgoKZmFzdCA9IGRhdGFfczFbZGF0YV9zMSRyb3Nfa20gPiAxLF0KZmFzdF9odW0gPSBmYXN0W2Zhc3QkaHVtYW4gPT0gMSxdCgpzdW0oZmFzdCRzaXplKS9zdW0oZGF0YV9zMSRzaXplKQpsZW5ndGgoZmFzdCRzaXplKS9sZW5ndGgoZGF0YV9zMSRzaXplKQoKc3VtKGZhc3RfaHVtJHNpemUsIG5hLnJtPVQpL3N1bShmYXN0JHNpemUpCmxlbmd0aChmYXN0X2h1bSRzaXplKS9sZW5ndGgoZmFzdCRzaXplKQoKCnF1YW4gPSBxdWFudGlsZShkYXRhX3MxJHJvc19rbSwwLjUpCmZhc3QgPSBkYXRhX3MxW2RhdGFfczEkcm9zX2ttID4gcXVhbixdCnNsb3cgPSBkYXRhX3MxW2RhdGFfczEkcm9zX2ttIDwgcXVhbixdCmZhc3RfaHVtID0gZmFzdFtmYXN0JGh1bWFuID09IDEsXQoKc3VtKGZhc3Qkc2l6ZSkvc3VtKGRhdGFfczEkc2l6ZSkKbGVuZ3RoKGZhc3Qkc2l6ZSkvbGVuZ3RoKGRhdGFfczEkc2l6ZSkKc3VtKChkYXRhX3MxJG1lYW5fQkFfcmVkKmRhdGFfczEkc2l6ZSkpLyhzdW0oZGF0YV9zMSRzaXplKSkKbWVhbihkYXRhX3MxJG1lYW5fQkFfcmVkKQoKc3VtKGZhc3RfaHVtJHNpemUsIG5hLnJtPVQpL3N1bShmYXN0JHNpemUpCmxlbmd0aChmYXN0X2h1bSRzaXplKS9sZW5ndGgoZmFzdCRzaXplKQpzdW0oKGZhc3QkbWVhbl9CQV9yZWQqZmFzdCRzaXplKSkvKHN1bShmYXN0JHNpemUpKQptZWFuKGZhc3QkbWVhbl9CQV9yZWQpCnN1bSgoc2xvdyRtZWFuX0JBX3JlZCpzbG93JHNpemUpKS8oc3VtKHNsb3ckc2l6ZSkpCm1lYW4oc2xvdyRtZWFuX0JBX3JlZCkKCgpgYGAKCgoKCldoZW4geW91IHNhdmUgdGhlIG5vdGVib29rLCBhbiBIVE1MIGZpbGUgY29udGFpbmluZyB0aGUgY29kZSBhbmQgb3V0cHV0IHdpbGwgYmUgc2F2ZWQgYWxvbmdzaWRlIGl0IChjbGljayB0aGUgKlByZXZpZXcqIGJ1dHRvbiBvciBwcmVzcyAqQ21kK1NoaWZ0K0sqIHRvIHByZXZpZXcgdGhlIEhUTUwgZmlsZSkuIAoKVGhlIHByZXZpZXcgc2hvd3MgeW91IGEgcmVuZGVyZWQgSFRNTCBjb3B5IG9mIHRoZSBjb250ZW50cyBvZiB0aGUgZWRpdG9yLiBDb25zZXF1ZW50bHksIHVubGlrZSAqS25pdCosICpQcmV2aWV3KiBkb2VzIG5vdCBydW4gYW55IFIgY29kZSBjaHVua3MuIEluc3RlYWQsIHRoZSBvdXRwdXQgb2YgdGhlIGNodW5rIHdoZW4gaXQgd2FzIGxhc3QgcnVuIGluIHRoZSBlZGl0b3IgaXMgZGlzcGxheWVkLgoKCgpgYGAKCgoKCgoK